Merge branch 'v8/dev' into v8/bugfix/AB2734-Image-Deletion-Bug

This commit is contained in:
Warren Buckley
2019-09-24 09:13:23 +01:00
23 changed files with 446 additions and 304 deletions

View File

@@ -955,7 +955,7 @@
},
"ansi-escapes": {
"version": "3.1.0",
"resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
"integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
"dev": true
},
@@ -1178,7 +1178,7 @@
"array-slice": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
"integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=",
"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
"dev": true
},
"array-sort": {
@@ -1555,7 +1555,7 @@
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
@@ -1571,7 +1571,7 @@
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"optional": true,
@@ -1746,7 +1746,7 @@
"buffer-alloc": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
"integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=",
"dev": true,
"requires": {
"buffer-alloc-unsafe": "^1.1.0",
@@ -1756,7 +1756,7 @@
"buffer-alloc-unsafe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
"integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=",
"dev": true
},
"buffer-crc32": {
@@ -2455,7 +2455,7 @@
},
"string_decoder": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
@@ -2578,7 +2578,7 @@
"core-js": {
"version": "2.5.7",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
"integrity": "sha1-+XJgj/DOrWi4QaFqky0LGDeRgU4=",
"integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
"dev": true
},
"core-util-is": {
@@ -3562,7 +3562,7 @@
"doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"dev": true,
"requires": {
"esutils": "^2.0.2"
@@ -4166,7 +4166,7 @@
},
"engine.io-client": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
"resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
"integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
"dev": true,
"requires": {
@@ -4368,7 +4368,7 @@
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"optional": true
}
@@ -4463,7 +4463,7 @@
"eslint-scope": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
"integrity": "sha1-UL8wcekzi83EMzF5Sgy1M/ATYXI=",
"integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
"dev": true,
"requires": {
"esrecurse": "^4.1.0",
@@ -4473,13 +4473,13 @@
"eslint-utils": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
"integrity": "sha1-moUbqJ7nxGA0b5fPiTnHKYgn5RI=",
"integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
"dev": true
},
"eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
"integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=",
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
"dev": true
},
"espree": {
@@ -4502,7 +4502,7 @@
"esquery": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
"integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=",
"integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
"dev": true,
"requires": {
"estraverse": "^4.0.0"
@@ -4511,7 +4511,7 @@
"esrecurse": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
"integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=",
"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
"dev": true,
"requires": {
"estraverse": "^4.1.0"
@@ -4587,7 +4587,7 @@
"exec-buffer": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz",
"integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==",
"integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=",
"dev": true,
"optional": true,
"requires": {
@@ -4796,7 +4796,7 @@
"fill-range": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=",
"dev": true,
"requires": {
"is-number": "^2.1.0",
@@ -5352,7 +5352,7 @@
"fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=",
"dev": true,
"optional": true
},
@@ -6140,7 +6140,7 @@
"global-modules": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
"integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=",
"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
"dev": true,
"requires": {
"global-prefix": "^1.0.1",
@@ -6743,7 +6743,7 @@
"gulp-eslint": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-5.0.0.tgz",
"integrity": "sha1-KiaECV93Syz3kxAmIHjFbMehK1I=",
"integrity": "sha512-9GUqCqh85C7rP9120cpxXuZz2ayq3BZc85pCTuPJS03VQYxne0aWPIXWx6LSvsGPa3uRqtSO537vaugOh+5cXg==",
"dev": true,
"requires": {
"eslint": "^5.0.1",
@@ -8198,7 +8198,7 @@
"is-absolute": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
"integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=",
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
"dev": true,
"requires": {
"is-relative": "^1.0.0",
@@ -8497,7 +8497,7 @@
"is-relative": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
"integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=",
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
"dev": true,
"requires": {
"is-unc-path": "^1.0.0"
@@ -8506,7 +8506,7 @@
"is-resolvable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
"dev": true
},
"is-retry-allowed": {
@@ -8556,7 +8556,7 @@
"is-unc-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
"integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=",
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
"dev": true,
"requires": {
"unc-path-regex": "^0.1.2"
@@ -8716,7 +8716,7 @@
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
"json-stable-stringify-without-jsonify": {
@@ -9475,7 +9475,7 @@
"lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=",
"dev": true,
"optional": true
},
@@ -9510,7 +9510,7 @@
"make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
"integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=",
"dev": true,
"requires": {
"pify": "^3.0.0"
@@ -9527,7 +9527,7 @@
"make-iterator": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
"integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=",
"integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
"dev": true,
"requires": {
"kind-of": "^6.0.2"
@@ -9724,7 +9724,7 @@
"mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
"dev": true
},
"minimatch": {
@@ -12877,7 +12877,7 @@
"dependencies": {
"minimist": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
"dev": true
},
@@ -13269,7 +13269,7 @@
"pluralize": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
"integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=",
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
"dev": true
},
"posix-character-classes": {
@@ -13961,7 +13961,7 @@
},
"string_decoder": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
@@ -14459,7 +14459,7 @@
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"sax": {
@@ -14648,7 +14648,7 @@
"setprototypeof": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
"integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=",
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
"dev": true
},
"shebang-command": {
@@ -14926,7 +14926,7 @@
},
"socket.io-parser": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
"resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
"integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
"dev": true,
"requires": {
@@ -15071,7 +15071,7 @@
},
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"optional": true,
@@ -15224,7 +15224,7 @@
"stream-consume": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
"integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=",
"integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==",
"dev": true
},
"stream-shift": {
@@ -15237,7 +15237,7 @@
"streamroller": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz",
"integrity": "sha1-odG3z4PTmvsNYwSaWsv5NJO99ks=",
"integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==",
"dev": true,
"requires": {
"date-format": "^1.2.0",
@@ -15264,7 +15264,7 @@
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
@@ -15279,7 +15279,7 @@
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
@@ -15296,7 +15296,7 @@
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"requires": {
"is-fullwidth-code-point": "^2.0.0",
@@ -15492,7 +15492,7 @@
"strip-outer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
"integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
"integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=",
"dev": true,
"optional": true,
"requires": {
@@ -15661,7 +15661,7 @@
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
@@ -15873,7 +15873,7 @@
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"dev": true,
"requires": {
"os-tmpdir": "~1.0.2"
@@ -15910,7 +15910,7 @@
"to-buffer": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
"integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
"integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=",
"dev": true,
"optional": true
},
@@ -16246,13 +16246,13 @@
"upath": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
"integrity": "sha1-NSVll+RqWB20eT0M5H+prr/J+r0=",
"integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
"dev": true
},
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=",
"integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"dev": true,
"requires": {
"punycode": "^2.1.0"

View File

@@ -327,10 +327,24 @@ In the following example you see how to run some custom logic before a step goes
}
var scrollParent = element.scrollParent();
var scrollToCenterOfContainer = element[0].offsetTop - (scrollParent[0].clientHeight / 2 ) + (element[0].clientHeight / 2);
var el = element;
var offsetTop = 0;
if (scrollParent[0] === document) {
offsetTop = el[0].offsetTop;
} else {
while ($.contains(scrollParent[0], el[0])) {
offsetTop += el[0].offsetTop;
el = el.offsetParent();
}
}
var scrollToCenterOfContainer = offsetTop - (scrollParent[0].clientHeight / 2);
if (element[0].clientHeight < scrollParent[0].clientHeight) {
scrollToCenterOfContainer += (element[0].clientHeight / 2);
}
// Detect if scroll is needed
if (element[0].offsetTop > scrollParent[0].clientHeight) {
if (offsetTop > scrollParent[0].clientHeight - 200) {
scrollParent.animate({
scrollTop: scrollToCenterOfContainer
}, function () {
@@ -391,7 +405,7 @@ In the following example you see how to run some custom logic before a step goes
}
if (position === "right") {
if (offset.top < documentHeight / 2) {
if (offset.top + popoverHeight < documentHeight) {
css.top = offset.top;
css.left = offset.left + width + margin;
} else {
@@ -411,7 +425,7 @@ In the following example you see how to run some custom logic before a step goes
}
if (position === "left") {
if (offset.top < documentHeight / 2) {
if (offset.top + popoverHeight < documentHeight) {
css.top = offset.top;
css.left = offset.left - popoverWidth - margin;
} else {

View File

@@ -38,7 +38,7 @@
//watch for changes to isNew & the content.id, set the page.isNew accordingly and load the breadcrumb if we can
$scope.$watchGroup(['isNew', 'content.id'], function (newVal, oldVal) {
var contentId = newVal[1];
$scope.page.isNew = Object.toBoolean(newVal[0]);
@@ -65,7 +65,7 @@
if (content.id && content.isChildOfListView && content.trashed === false) {
$scope.page.listViewPath = "/content/content/edit/" + content.parentId
+ "?list=" + $routeParams.list
+ "&page=" + $routeParams.page
+ "&page=" + $routeParams.page
+ "&filter=" + $routeParams.filter
+ "&orderBy=" + $routeParams.orderBy
+ "&orderDirection=" + $routeParams.orderDirection;
@@ -171,6 +171,24 @@
}
}));
evts.push(eventsService.on("editors.content.reload", function (name, args) {
if (args && args.node && $scope.content.id === args.node.id) {
reload();
loadBreadcrumb();
syncTreeNode($scope.content, $scope.content.path);
}
}));
evts.push(eventsService.on("rte.file.uploading", function(){
$scope.page.saveButtonState = "busy";
$scope.page.buttonGroupState = "busy";
}));
evts.push(eventsService.on("rte.file.uploaded", function(){
$scope.page.saveButtonState = "success";
$scope.page.buttonGroupState = "success";
}));
}
/**
@@ -493,7 +511,7 @@
$scope.unpublish = function () {
clearNotifications($scope.content);
if (formHelper.submitForm({ scope: $scope, action: "unpublish", skipValidation: true })) {
if (formHelper.submitForm({ scope: $scope, action: "unpublish", skipValidation: true })) {
var dialog = {
parentScope: $scope,
view: "views/content/overlays/unpublish.html",

View File

@@ -364,6 +364,22 @@
};
scope.openDocumentType = function (documentTypeId) {
const editor = {
id: documentTypeId,
submit: function (model) {
const args = { node: scope.model };
eventsService.emit("editors.documentType.reload", args);
editorService.close();
},
close: function () {
editorService.close();
}
};
editorService.documentTypeEditor(editor);
};
/* ---------- GROUPS ---------- */
scope.addGroup = function(group) {

View File

@@ -7,7 +7,7 @@
* A service containing all logic for all of the Umbraco TinyMCE plugins
*/
function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, stylesheetResource, macroResource, macroService,
$routeParams, umbRequestHelper, angularHelper, userService, editorService, entityResource) {
$routeParams, umbRequestHelper, angularHelper, userService, editorService, entityResource, eventsService) {
//These are absolutely required in order for the macros to render inline
//we put these as extended elements because they get merged on top of the normal allowed elements by tiny mce
@@ -167,6 +167,18 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
xhr = new XMLHttpRequest();
xhr.open('POST', Umbraco.Sys.ServerVariables.umbracoUrls.tinyMceApiBaseUrl + 'UploadImage');
xhr.onloadstart = function(e) {
angularHelper.safeApply($rootScope, function() {
eventsService.emit("rte.file.uploading");
});
};
xhr.onloadend = function(e) {
angularHelper.safeApply($rootScope, function() {
eventsService.emit("rte.file.uploaded");
});
};
xhr.upload.onprogress = function (e) {
progress(e.loaded / e.total * 100);
};

View File

@@ -1,23 +1,27 @@
<div ng-controller="Umbraco.Installer.PackagesController" id="starterKits">
<h1>Install a starter website</h1>
<div ng-controller="Umbraco.Installer.PackagesController" id="starterKits">
<h1>Install a starter website</h1>
<p>
Installing a starter website helps you learn how Umbraco works, and
gives you a solid and simple foundation to build on top of.
</p>
<p>
Installing a starter website helps you learn how Umbraco works, and gives you a solid
and simple foundation to build on top of.
</p>
<small ng-if="!packages || packages.length == 0">Loading...</small>
<ul class="thumbnails">
<ul class="thumbnails">
<li class="span3" ng-repeat="pck in packages">
<a href ng-click="setPackageAndContinue(pck.id)" class="thumbnail">
<small>Loading...</small>
<img ng-src="https://our.umbraco.com{{pck.thumbnail}}?width=170" alt="{{pck.name}}">
<a ng-click="setPackageAndContinue(pck.id)" class="thumbnail">
<img ng-src="https://our.umbraco.com{{
pck.thumbnail
}}?width=170"
alt="{{ pck.name }}" />
<small>Install starter website</small>
</a>
</li>
</ul>
<a href ng-click="setPackageAndContinue('00000000-0000-0000-0000-000000000000')" class="btn btn-link btn-link-reverse">
<a href ng-click="setPackageAndContinue('00000000-0000-0000-0000-000000000000')"
class="btn btn-link btn-link-reverse">
No thanks, I do not want to install a starter website
</a>
</div>

View File

@@ -1,72 +1,71 @@
<div ng-controller="Umbraco.Install.UserController">
<h1>Install Umbraco 8</h1>
<div ng-controller="Umbraco.Install.UserController">
<h1>Install Umbraco 8</h1>
<p>Enter your name, email and password to install Umbraco 8 with its default settings, alternatively you can customize your installation</p>
<p>Enter your name, email and password to install Umbraco 8 with its default settings, alternatively you can customize your installation</p>
<form name="myForm" class="form-horizontal" novalidate ng-submit="validateAndInstall();">
<form name="myForm" class="form-horizontal" novalidate ng-submit="validateAndInstall();">
<div class="row">
<div class="span8">
<div class="pull-right">
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
<input type="text" id="name" name="name" placeholder="Full name" required ng-model="installer.current.model.name" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">Email</label>
<div class="controls">
<input type="email" id="email" name="email" placeholder="you@example.com" val-email required ng-model="installer.current.model.email" />
<small class="inline-help">Your email will be used as your login</small>
</div>
</div>
<div class="control-group">
<label class="control-label" for="password">Password</label>
<div class="controls">
<!-- why isn't this masked: https://www.nngroup.com/articles/stop-password-masking/ -->
<input type="text" name="installer.current.model.password"
ng-minlength="{{installer.current.model.minCharLength}}"
ng-pattern="passwordPattern"
autocorrect="off"
autocapitalize="off"
autocomplete="off"
required
ng-model="installer.current.model.password" id="password" />
<small class="inline-help">At least {{installer.current.model.minCharLength}} characters long</small>
<small ng-if="installer.current.model.minNonAlphaNumericLength > 0" class="inline-help">
At least {{installer.current.model.minNonAlphaNumericLength}} symbol{{installer.current.model.minNonAlphaNumericLength > 1 ? 's' : ''}}
</small>
<div class="row">
<div class="span8">
<div class="pull-right">
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
<input type="text" id="name" name="name" placeholder="Full name" required ng-model="installer.current.model.name" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">Email</label>
<div class="controls">
<input type="email" id="email" name="email" placeholder="you@example.com" val-email required ng-model="installer.current.model.email" />
<small class="inline-help">Your email will be used as your login</small>
</div>
</div>
<div class="control-group">
<label class="control-label" for="password">Password</label>
<div class="controls">
<!-- why isn't this masked: https://www.nngroup.com/articles/stop-password-masking/ -->
<input type="text" name="installer.current.model.password"
ng-minlength="{{installer.current.model.minCharLength}}"
ng-pattern="passwordPattern"
autocorrect="off"
autocapitalize="off"
autocomplete="off"
required
ng-model="installer.current.model.password" id="password" />
<small class="inline-help">At least {{installer.current.model.minCharLength}} characters long</small>
<small ng-if="installer.current.model.minNonAlphaNumericLength > 0" class="inline-help">
At least {{installer.current.model.minNonAlphaNumericLength}} symbol{{installer.current.model.minNonAlphaNumericLength > 1 ? 's' : ''}}
</small>
</div>
</div>
</div>
<div class="control-group">
<div class="controls">
<label>
<input
type="checkbox"
id="subscribeToNewsLetter"
name="subscribeToNewsLetter"
ng-model="installer.current.model.subscribeToNewsLetter" />
Keep me updated on Umbraco Versions, Security Bulletins and Community News
</label>
</div>
</div>
<div class="control-group">
<div class="controls">
<label>
<input type="checkbox"
id="subscribeToNewsLetter"
name="subscribeToNewsLetter"
ng-model="installer.current.model.subscribeToNewsLetter" />
Keep me updated on Umbraco Versions, Security Bulletins and Community News
</label>
</div>
</div>
<div class="control-group" ng-class="{disabled:myForm.$invalid}">
<div class="controls">
<input type="submit" ng-disabled="myForm.$invalid" value="Install" class="btn btn-success" />
<a href class="btn btn-info control-customize" ng-disabled="myForm.$invalid" ng-click="validateAndForward()">Customize</a>
</div>
</div>
<div class="control-group" ng-class="{disabled:myForm.$invalid}">
<div class="controls">
<input type="submit" ng-disabled="myForm.$invalid" value="Install" class="btn btn-success" />
<button class="btn btn-info control-customize" ng-disabled="myForm.$invalid" ng-click="validateAndForward()">Customize</button>
</div>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</form>
</div>

View File

@@ -272,7 +272,6 @@ a, a:hover{
ul.sections {
display: block;
background: #1b264f;
height: 100%;
position:absolute;
top: 90px;
width: 80px;
@@ -281,12 +280,21 @@ ul.sections {
margin:0;
padding:0;
margin-left: -80px;
overflow: scroll;
overflow-x: hidden;
height: calc(100% - 91px);
&::-webkit-scrollbar {
width: 0px;
background: transparent;
}
}
ul.sections li {
display: block;
border-left: 4px #1b264f solid;
transition: all .3s linear;
cursor: pointer;
}
.fix-left-menu ul.sections li a span,

View File

@@ -1,4 +1,4 @@
// Core variables and mixins
// Core variables and mixins
@import "fonts.less"; // Loading fonts
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
@@ -18,154 +18,172 @@
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none !important;
display: none !important;
}
html {
background: url('../img/installer.jpg') no-repeat center center fixed;
background-size: cover;
background: url('../img/installer.jpg') no-repeat center center fixed;
background-size: cover;
}
body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
font-family: @baseFontFamily;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @textColor;
vertical-align: middle;
text-align: center;
// better font rendering
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
margin: 0;
padding: 0;
height: 100%;
width: 100%;
font-family: @baseFontFamily;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @textColor;
vertical-align: middle;
text-align: center;
// better font rendering
-webkit-font-smoothing: antialiased;
font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
#logo{
position: absolute;
top: 20px;
left: 20px;
opacity: 0.8;
z-index: 777;
#logo {
position: absolute;
top: 20px;
left: 20px;
opacity: 0.8;
z-index: 777;
}
#installer{
margin: auto;
#installer {
margin: auto;
background: @white;
width: 750px;
height: 600px;
text-align: left;
padding: 30px;
overflow:hidden;
z-index: 667;
width: 750px;
height: 600px;
text-align: left;
padding: 30px;
overflow: hidden;
z-index: 667;
}
#overlay{
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: @purple-d2;
z-index: 666;
#overlay {
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: @purple-d2;
z-index: 666;
}
.loading #overlay{
.loading #overlay {
opacity: 0.5;
display: block !important;
}
#fact{
color: @white;
text-shadow: 0px 0px 4px @black;
font-size: 25px;
text-align: left;
line-height: 35px;
z-index: 667;
height: 600px;
width: 750px;
#fact {
color: @white;
text-shadow: 0px 0px 4px @black;
font-size: 25px;
text-align: left;
line-height: 35px;
z-index: 667;
height: 600px;
width: 750px;
h2 {
font-size: 35px;
border-bottom: 1px solid @white;
padding-bottom: 10px;
margin-bottom: 20px;
color: @white;
}
a {
color: @white;
}
}
#fact h2{
font-size: 35px;
border-bottom: 1px solid @white;
padding-bottom: 10px;
margin-bottom: 20px;
color: @white;
}
#fact a{color: @white;}
#feedback{
color: @white;
text-shadow: 0px 0px 4px @black;
font-size: 14px;
text-align: center;
line-height: 20px;
z-index: 667;
bottom: 20px;
right: 0;
left: 0;
height: 25px;
position: absolute;
#feedback {
color: @white;
text-shadow: 0px 0px 4px @black;
font-size: 14px;
text-align: center;
line-height: 20px;
z-index: 667;
bottom: 20px;
right: 0;
left: 0;
height: 25px;
position: absolute;
}
h1{
border-bottom: 1px solid @gray-10;
padding-bottom: 10px;
color: @gray-2;
h1 {
border-bottom: 1px solid @gray-10;
padding-bottom: 10px;
color: @gray-2;
}
.error h1, .error .message, span.error{ color: @red;}
.error h1, .error .message, span.error {
color: @red;
}
legend{font-size: 14px; font-weight: bold}
legend {
font-size: 14px;
font-weight: bold
}
input.ng-dirty.ng-invalid{border-color: #b94a48; color: #b94a48;}
.disabled{
opacity: 0.6;
input.ng-dirty.ng-invalid {
border-color: #b94a48;
color: #b94a48;
}
.disabled {
opacity: 0.6;
}
#installer label.control-label,
#installer label.control-label,
#installer .constrol-label {
padding-top: 5px !important;
}
.controls{
text-align: left
}
.controls {
text-align: left;
.controls small{display: block; color: @gray-3;}
small {
display: block;
color: @gray-3;
}
}
.absolute-center {
margin: auto;
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
margin: auto;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
.fade-hide, .fade-show {
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
}
.fade-hide {
opacity:1;
}
.fade-hide.fade-hide-active {
opacity:0;
}
.fade-hide,
.fade-show {
opacity:0;
transition: all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
}
.fade-hide {
opacity: 1;
}
.fade-hide.fade-hide-active {
opacity: 0;
}
.fade-show {
opacity: 0;
}
.fade-show.fade-show-active {
opacity:1;
opacity: 1;
}
.umb-installer-loader {
@@ -180,49 +198,60 @@ input.ng-dirty.ng-invalid{border-color: #b94a48; color: #b94a48;}
}
.permissions-report {
overflow:auto;
height:320px;
margin:0;
display:block;
padding:0;
overflow: auto;
height: 320px;
margin: 0;
display: block;
padding: 0;
}
.permissions-report > li {
list-style:none;
list-style: none;
}
.permissions-report h4 {
margin:7px;
margin: 7px;
}
.upgrade-report {
overflow:auto;
height:280px;
display:block;
overflow: auto;
height: 280px;
display: block;
}
select {
width:320px;
width: 320px;
}
#ysod {
height:500px;
width:100%;
overflow:auto;
border:none;
height: 500px;
width: 100%;
overflow: auto;
border: none;
}
#starterKits .thumbnails{
min-height:128px;
}
#starterKits a.thumbnail {
position:relative;
height:98px;
}
#starterKits a.thumbnail small {
position:absolute;
z-index: 50;
top:10px;
left:10px;
}
#starterKits a.thumbnail img {
position:relative;
z-index:100;
#starterKits {
.thumbnails {
min-height: 128px;
padding-left: 0;
}
.thumbnail {
position: relative;
cursor: pointer;
small {
padding: 10px 10px 5px;
display: inline-block;
}
img {
position: relative;
z-index: 100;
}
}
.btn-link {
padding-left: 0;
}
}

View File

@@ -66,3 +66,5 @@
.ml5 { margin-left: @spacing-extra-large; }
.ml6 { margin-left: @spacing-extra-extra-large; }
.ml7 { margin-left: @spacing-extra-extra-extra-large; }
.p0 { padding: @spacing-none; }

View File

@@ -143,7 +143,10 @@ var app = angular.module("umbraco.preview", ['umbraco.resources', 'umbraco.servi
setPageUrl();
}
};
$scope.isCurrentCulture = function(culture) {
return $location.search().culture === culture;
}
})

View File

@@ -81,7 +81,7 @@
<i class="icon icon-merge"></i>
<localize key="contentTypeEditor_inheritedFrom"></localize>: {{ tab.inheritedFromName }}
<span ng-repeat="contentTypeName in tab.parentTabContentTypeNames">
<a href="#/settings/documentTypes/edit/{{tab.parentTabContentTypes[$index]}}">{{ contentTypeName }}</a>
<button type="button" class="btn-link btn-small p0" ng-click="openDocumentType(tab.parentTabContentTypes[$index])">{{ contentTypeName }}</button>
<span ng-if="!$last">, </span>
</span>
</div>

View File

@@ -497,6 +497,12 @@
loadDocumentType();
}));
evts.push(eventsService.on("editors.documentType.reload", function (name, args) {
if (args && args.node && vm.contentType.id === args.node.id) {
loadDocumentType();
}
}));
evts.push(eventsService.on("editors.documentType.saved", function(name, args) {
if(args.documentType.allowedTemplates.length > 0){
navigationService.syncTree({ tree: "templates", path: [], forceReload: true })

View File

@@ -16,7 +16,7 @@
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<umb-button button-style="success"
<umb-button button-style="action"
type="button"
action="vm.addLanguage()"
label-key="languages_addLanguage">

View File

@@ -1,7 +1,7 @@
<div class="wmd-panel" ng-controller="Umbraco.PropertyEditors.MarkdownEditorController">
<div id="wmd-button-bar-{{editorId}}"></div>
<textarea class="wmd-input" id="wmd-input-{{editorId}}" ng-model="model.value"></textarea>
<textarea class="wmd-input" id="wmd-input-{{editorId}}" ng-model="model.value" ng-required="model.validation.mandatory"></textarea>
<div class="wmd-panel wmd-preview" id="wmd-preview-{{editorId}}" ng-show="model.config.preview"></div>

View File

@@ -53,4 +53,6 @@
</ul>
</div>
<input type="hidden" name="mandatory" ng-model="model.mandatory" ng-required="model.validation.mandatory && !mediaItems.length" />
</div>

View File

@@ -18,4 +18,6 @@
<localize key="general_add">Add</localize>
</a>
<input type="hidden" name="mandatory" ng-model="model.mandatory" ng-required="model.validation.mandatory && !renderModel.length" />
</div>

View File

@@ -18,4 +18,6 @@
<localize key="general_add">Add</localize>
</a>
<input type="hidden" name="mandatory" ng-model="model.mandatory" ng-required="model.validation.mandatory && !renderModel.length" />
</div>

View File

@@ -80,6 +80,7 @@
break;
default:
}
validate();
}
$scope.add = function () {
@@ -89,6 +90,7 @@
var newItemIndex = $scope.model.value.length - 1;
$scope.model.value[newItemIndex].hasFocus = true;
}
validate();
};
$scope.remove = function (index) {
@@ -118,6 +120,16 @@
$scope.promptIsVisible = "-1";
}
function validate() {
if ($scope.multipleTextboxForm) {
var invalid = $scope.model.validation.mandatory && !$scope.model.value.length
$scope.multipleTextboxForm.mandatory.$setValidity("minCount", !invalid);
}
}
$timeout(function () {
validate();
});
}
angular.module("umbraco").controller("Umbraco.PropertyEditors.MultipleTextBoxController", MultipleTextBoxController);

View File

@@ -1,31 +1,32 @@
<div class="umb-property-editor umb-multiple-textbox" ng-controller="Umbraco.PropertyEditors.MultipleTextBoxController">
<div ui-sortable="sortableOptions" ng-model="model.value">
<div class="flex flex-wrap textbox-wrapper" ng-repeat="item in model.value track by $index">
<input type="text" name="item_{{$index}}" ng-model="item.value" class="umb-property-editor umb-textstring textstring flx-i"
ng-keyup="addRemoveOnKeyDown($event, $index)" focus-when="{{item.hasFocus}}"/>
<div class="icon-wrapper">
<i class="icon icon-navigation handle" localize="title" title="@general_move"></i>
<div class="umb-multiple-textbox__confirm" ng-show="model.value.length > model.config.min">
<button class="umb-multiple-textbox__confirm-action" type="button" prevet-default ng-click="showPrompt($index, item)" localize="title" title="@content_removeTextBox">
<i class="icon-trash"></i>
</button>
<umb-confirm-action
ng-if="promptIsVisible === $index"
direction="left"
on-confirm="remove($index)"
on-cancel="hidePrompt()">
</umb-confirm-action>
</div>
</div>
<ng-form name="multipleTextboxForm">
<div ui-sortable="sortableOptions" ng-model="model.value">
<div class="flex flex-wrap textbox-wrapper" ng-repeat="item in model.value track by $index">
<input type="text" name="item_{{$index}}" ng-model="item.value" class="umb-property-editor umb-textstring textstring flx-i"
ng-keyup="addRemoveOnKeyDown($event, $index)" focus-when="{{item.hasFocus}}"/>
<div class="icon-wrapper">
<i class="icon icon-navigation handle" localize="title" title="@general_move"></i>
<div class="umb-multiple-textbox__confirm" ng-show="model.value.length > model.config.min">
<button class="umb-multiple-textbox__confirm-action" type="button" prevet-default ng-click="showPrompt($index, item)" localize="title" title="@content_removeTextBox">
<i class="icon-trash"></i>
</button>
<umb-confirm-action
ng-if="promptIsVisible === $index"
direction="left"
on-confirm="remove($index)"
on-cancel="hidePrompt()">
</umb-confirm-action>
</div>
</div>
</div>
</div>
</div>
<a prevent-default href="" class="add-link" localize="title" title="@content_addTextBox"
ng-show="model.config.max <= 0 || model.value.length < model.config.max"
ng-click="add()">
<localize key="general_add">Add</localize>
</a>
<a prevent-default href="" class="add-link" localize="title" title="@content_addTextBox"
ng-show="model.config.max <= 0 || model.value.length < model.config.max"
ng-click="add()">
<localize key="general_add">Add</localize>
</a>
<input type="hidden" name="mandatory" ng-model="model.value" />
</ng-form>
</div>

View File

@@ -1,6 +1,6 @@
<div ng-controller="Umbraco.PropertyEditors.textAreaController">
<ng-form name="textareaFieldForm">
<textarea ng-model="model.value" id="{{model.alias}}" name="textarea" rows="{{model.config.rows || 10}}" class="umb-property-editor umb-textarea textstring" val-server="value" ng-keyup="model.change()"></textarea>
<textarea ng-model="model.value" id="{{model.alias}}" name="textarea" rows="{{model.config.rows || 10}}" class="umb-property-editor umb-textarea textstring" val-server="value" ng-keyup="model.change()" ng-required="model.validation.mandatory" aria-required="{{model.validation.mandatory}}"></textarea>
<span ng-messages="textareaFieldForm.textarea.$error" show-validation-on-submit >
<span class="help-inline" ng-message="required"><localize key="general_required">Required</localize></span>

View File

@@ -1,6 +1,18 @@
describe('RTE controller tests', function () {
var scope, controllerFactory;
//mock tinymce globals
if ((typeof tinymce) === "undefined") {
tinymce = {
DOM: {
events: {
domLoaded: false
}
},
baseUrl: ""
}
}
beforeEach(module('umbraco', function ($provide) {
$provide.value('tinyMceAssets', []);
}));

View File

@@ -44,21 +44,21 @@
</div>
<ul class="sections" ng-class="{selected: showDevicesPreview && showDevices}">
<li ng-repeat="device in devices" ng-class="{ current:previewDevice==device }">
<a href="" ng-click="updatePreviewDevice(device)"><i class="icon {{device.icon}}" title="{{device.title}}"></i><span></span></a>
<a ng-click="updatePreviewDevice(device)"><i class="icon {{device.icon}}" title="{{device.title}}"></i><span></span></a>
</li>
@if (Model.Languages != null && Model.Languages.Count() > 1)
{
foreach (var previewLink in Model.Languages)
{
<li>
<a href="" ng-click="changeCulture('@previewLink.IsoCode')" title="Preview in @previewLink.CultureName"><i class="icon icon-globe-europe---africa"></i><span>@previewLink.CultureName</span></a>
<li ng-class="{ current:isCurrentCulture('@previewLink.IsoCode') }">
<a ng-click="changeCulture('@previewLink.IsoCode')" title="Preview in @previewLink.CultureName"><i class="icon icon-globe-europe---africa"></i><span>@previewLink.CultureName</span></a>
</li>
}
}
<li>
<a href="" ng-click="exitPreview()" title="Exit Preview"><i class="icon icon-wrong"></i><span> </span></a>
<a ng-click="exitPreview()" title="Exit Preview"><i class="icon icon-wrong"></i><span> </span></a>
</li>
</ul>
</div>