diff --git a/app.engine.rule/build.gradle b/app.engine.rule/build.gradle index 5c45bf86..e3a22dc9 100644 --- a/app.engine.rule/build.gradle +++ b/app.engine.rule/build.gradle @@ -13,7 +13,6 @@ dependencies { implementation ( project(":io.sc.platform.app"), project(":io.sc.platform.developer"), - project(":io.sc.platform.security.loginform"), project(":io.sc.platform.scheduler.manager"), project(":io.sc.platform.scheduler.executor"), diff --git a/app.platform/build.gradle b/app.platform/build.gradle index 48eb40af..d7111a75 100644 --- a/app.platform/build.gradle +++ b/app.platform/build.gradle @@ -13,32 +13,31 @@ dependencies { implementation ( project(":io.sc.platform.app"), project(":io.sc.platform.developer"), - project(":io.sc.platform.security.oauth2.server.authorization"), - project(":io.sc.platform.security.oauth2.server.resource"), - project(":io.sc.platform.security.loginform"), + project(":io.sc.standard"), - /* + // 调度 project(":io.sc.platform.scheduler.manager"), project(":io.sc.platform.scheduler.executor"), - project(":io.sc.engine.mv"), - project(":io.sc.engine.mv.frontend"), - project(":io.sc.engine.mv.sample"), - + // 规则引擎 project(":io.sc.engine.rule.client"), project(":io.sc.engine.rule.client.spring"), project(":io.sc.engine.rule.core"), project(":io.sc.engine.rule.server"), project(":io.sc.engine.rule.sample"), + // 模型验证 + project(":io.sc.engine.mv"), + project(":io.sc.engine.mv.frontend"), + project(":io.sc.engine.mv.sample"), + + // 压力测试 project(":io.sc.engine.st"), project(":io.sc.engine.st.frontend"), -// project(":erm"), -// project(":erm.frontend"), - - project(":io.sc.standard"), - */ + // 全面风险 + project(":erm"), + project(":erm.frontend"), ) } diff --git a/build.gradle b/build.gradle index 431c1d33..8371ab35 100644 --- a/build.gradle +++ b/build.gradle @@ -682,15 +682,15 @@ subprojects { processResources { if(isFrontendProject(file('.'))) { - exclude("**/${project.name}/*.*"); - if(project.name!='io.sc.platform.mvc.frontend' && project.name!='io.sc.platform.security.frontend'){ -// exclude("**/${project.name}/javascript/codemirror.*"); -// exclude("**/${project.name}/javascript/echarts.*"); -// exclude("**/${project.name}/javascript/platform-core.*"); -// exclude("**/${project.name}/javascript/quasar.*"); -// exclude("**/${project.name}/javascript/vue.*"); -// exclude("**/${project.name}/fonts/*.*"); -// exclude("**/${project.name}/webjars/**/*.*"); + if(project.name!='io.sc.platform.mvc.frontend'){ + exclude("**/${project.name}/*.*"); + exclude("**/${project.name}/javascript/codemirror.*"); + exclude("**/${project.name}/javascript/echarts.*"); + exclude("**/${project.name}/javascript/platform-core.*"); + exclude("**/${project.name}/javascript/quasar.*"); + exclude("**/${project.name}/javascript/vue.*"); + exclude("**/${project.name}/fonts/*.*"); + exclude("**/${project.name}/webjars/**/*.*"); } } } diff --git a/erm.frontend/package.json b/erm.frontend/package.json index c28bdbe4..5adc8978 100644 --- a/erm.frontend/package.json +++ b/erm.frontend/package.json @@ -1,6 +1,6 @@ { "name": "erm.frontend", - "version": "8.1.44", + "version": "8.1.46", "description": "", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.287", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/erm.frontend/public/configure.js b/erm.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/erm.frontend/public/configure.js +++ b/erm.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css deleted file mode 100644 index bcbb5386..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css +++ /dev/null @@ -1,56 +0,0 @@ -/* -The proprietary Cambria fonts are installed by default on Microsoft Windows 7 -and higher and are provided with some other Microsoft products such as Office. -Some Web services may also provide them as Web fonts. For details, see - http://www.microsoft.com/typography/fonts/family.aspx?FID=291 - http://www.microsoft.com/typography/fonts/family.aspx?FID=360 -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Cambria; - src: local('Cambria'), url('...'); -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold'), url('...'); - font-weight: bold; -} -@font-face { - font-family: Cambria; - src: local('Cambria Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold Italic'), url('...'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Cambria Math; - src: local('Cambria Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Cambria; -} -m|math { - font-family: Cambria Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 deleted file mode 100644 index c74b7517..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 deleted file mode 100644 index c3620b3b..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 deleted file mode 100644 index 3d641e3d..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 deleted file mode 100644 index 163819b5..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 deleted file mode 100644 index 51776932..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css deleted file mode 100644 index ee48b1d3..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css +++ /dev/null @@ -1,51 +0,0 @@ -/* -Deja Vu is released under a Free License. See the files in this directory -for details. This fonts is available on most Linux distributions. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: DejaVu Math TeX Gyre; - src: url('DejaVuMathTeXGyre.woff2'), url('DejaVuMathTeXGyre.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif.woff2'), url('DejaVuSerif.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Bold.woff2'), url('DejaVuSerif-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Italic.woff2'), url('DejaVuSerif-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-BoldItalic.woff2'), - url('DejaVuSerif-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: DejaVu Serif; -} -m|math { - font-family: DejaVu Math TeX Gyre; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 deleted file mode 100644 index c13030cd..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css deleted file mode 100644 index c05d74d6..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -The FiraMath font is released under the SIL Open Font License. See the files in -this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Fira Math; - src: local('Fira Math'), local('FiraMath-Regular'), - url('FiraMath-Regular.woff2'), url('FiraMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - /* TODO: use FiraGO instead? */ - font-family: Fira Math; -} -m|math { - font-family: Fira Math; -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 deleted file mode 100644 index 3c27d39f..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 deleted file mode 100644 index e946d53e..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 deleted file mode 100644 index 0dd7d2ed..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 deleted file mode 100644 index e7dfb1d1..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 deleted file mode 100644 index 2c488f2a..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css deleted file mode 100644 index ea0116c9..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css +++ /dev/null @@ -1,50 +0,0 @@ -/* -The GFS Neohellenic fonts are released under the SIL Open Font License. See the -files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Regular'), - url('GFSNeohellenic.woff2'), - url('GFSNeohellenic.woff'); -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Bold'), - url('GFSNeohellenic-Bold.woff2'), - url('GFSNeohellenic-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Italic'), - url('GFSNeohellenic-It.woff2'), - url('GFSNeohellenic-It.woff'); - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-BoldItalic'), - url('GFSNeohellenic-BoldIt.woff2'), - url('GFSNeohellenic-BoldIt.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic Math; - src: local('GFSNeohellenicMath'), - url('GFSNeohellenicMath.woff2'), - url('GFSNeohellenicMath.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: GFS Neohellenic; -} -m|math { - font-family: GFS Neohellenic Math; -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css deleted file mode 100644 index cbf76d3d..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSans is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSans; - src: url('FreeSans.woff2'), url('FreeSans.woff'); -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBold.woff2'), url('FreeSansBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansOblique.woff2'), url('FreeSansOblique.woff'); - font-style: oblique; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBoldOblique.woff2'), url('FreeSansBoldOblique.woff'); - font-weight: bold; - font-style: oblique; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSans; -} -m|math { - font-family: FreeSans; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css deleted file mode 100644 index 9572fbfe..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSerif is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSerif; - src: url('FreeSerif.woff2'), url('FreeSerif.woff'); -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBold.woff2'), url('FreeSerifBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifItalic.woff2'), url('FreeSerifItalic.woff'); - font-style: italic; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBoldItalic.woff2'), url('FreeSerifBoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSerif; -} -m|math { - font-family: FreeSerif; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 deleted file mode 100644 index 21fe6278..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 deleted file mode 100644 index 9d8c372e..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 deleted file mode 100644 index 72102330..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css deleted file mode 100644 index f8b1e9df..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css +++ /dev/null @@ -1,35 +0,0 @@ -/* -The Garamond fonts are released under the SIL Open Font License. See the files -in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Regular'), - url('EBGaramond12-Regular.woff2'), - url('EBGaramond12-Regular.woff'); -} -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Italic'), - url('EBGaramond12-Italic.woff2'), - url('EBGaramond12-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: Garamond Math; - src: local('Garamond-Math'), - url('Garamond-Math.woff2'), - url('Garamond-Math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: EB Garamond; -} -m|math { - font-family: Garamond Math; -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 deleted file mode 100644 index 6110b17b..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 deleted file mode 100644 index df169efa..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 deleted file mode 100644 index c4ef3ed4..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 deleted file mode 100644 index ae0f344e..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css deleted file mode 100644 index b4b0ceeb..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css +++ /dev/null @@ -1,53 +0,0 @@ -/* -The Latin Modern fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Latin Modern Roman has various sizes. We use the generic name - "Latin Modern Roman" for the local versions and "LMRoman12" for the Web font. -*/ -@font-face { - font-family: LMRoman12; - src: url('lmroman12-regular.woff2'), url('lmroman12-regular.woff'); -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-bold.woff2'), url('lmroman12-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-italic.woff2'), url('lmroman12-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Latin Modern Math; - src: local('Latin Modern Math'), local('LatinModernMath-Regular'), - url('latinmodern-math.woff2'), url('latinmodern-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Latin Modern Roman, LMRoman12; -} -m|math { - font-family: Latin Modern Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 deleted file mode 100644 index c76bab8c..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 deleted file mode 100644 index 34b9f93b..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 deleted file mode 100644 index 19fbf7b9..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 deleted file mode 100644 index dd20fdcf..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 deleted file mode 100644 index a7ef60ef..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css deleted file mode 100644 index fe6d41c2..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The Libertinus fonts are released under the SIL Open Font and GPL Licenses. See -the files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif'), local('LibertinusSerif'), - url('libertinusserif-regular.woff2'), - url('libertinusserif-regular.woff'); -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold'), local('LibertinusSerif-Bold'), - url('libertinusserif-bold.woff2'), - url('libertinusserif-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Italic'), local('LibertinusSerif-Italic'), - url('libertinusserif-italic.woff2'), - url('libertinusserif-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold Italic'), - local('LibertinusSerif-BoldItalic'), - url('libertinusserif-bolditalic.woff2'), - url('libertinusserif-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Libertinus Math; - src: local('Libertinus Math'), local('LibertinusMath'), - url('libertinusmath-regular.woff2'), - url('libertinusmath-regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Libertinus Serif; -} -m|math { - font-family: Libertinus Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* No math script */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css deleted file mode 100644 index 5f056577..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css +++ /dev/null @@ -1,58 +0,0 @@ -/* -The commercial Lucida Bright fonts can be obtained from -http://tug.org/store/lucida/opentype.html and some Web services might -provide them as Web fonts. See also - http://www.microsoft.com/typography/fonts/family.aspx?FID=186 - http://www.microsoft.com/typography/fonts/family.aspx?FID=217 - -Warning: The CSS rules below have not been tested. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright'), url('...'); -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold'), url('...'); - font-weight: bolder; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold Italic'), url('...'); - font-weight: bolder; - font-style: italic; -} -@font-face { - font-family: Lucida Bright Math; - src: local('Lucida Bright Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Lucida Bright; -} -m|math { - font-family: Lucida Bright Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css deleted file mode 100644 index 640b0eaf..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css +++ /dev/null @@ -1,37 +0,0 @@ -/* -The commercial Minion Math fonts and can be obtained from -http://www.typoma.com/en/fonts.html and some Web services might provide them as -Web fonts. - -Warning: The CSS rules below have not been tested. More rules should probably -be added to make this work correctly. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Minion Math; - src: local('Minion Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Minion Math; -} -m|math { - font-family: Minion Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css deleted file mode 100644 index 8df86bf5..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css +++ /dev/null @@ -1,34 +0,0 @@ -/* -Neo Euler is released under the SIL Open Font License. See the files in this -directory for details. The font is still in development. The font does not seem -to have a corresponding "non-MATH" font. - -The WOFF fonts have been obtained from -https://github.com/khaledhosny/euler-otf/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Neo Euler; - src: local('Neo Euler'), url('euler.woff2'), url('euler.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Neo Euler; -} -m|math { - font-family: Neo Euler; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 deleted file mode 100644 index 279a98f0..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 deleted file mode 100644 index e4394884..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 deleted file mode 100644 index 0dc0baed..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 deleted file mode 100644 index 5594de32..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 deleted file mode 100644 index 263c488a..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css deleted file mode 100644 index 4b287cee..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -The STIX fonts are released under the SIL Open Font License. See the files in -this directory for details. The font can be obtained from several TeX -distributions or package managers. - -The WOFF fonts have been obtained from -http://downloads.sourceforge.net/project/stixfonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText'), - url('STIXTwoText-Regular.woff2'), - url('STIXTwoText-Regular.woff'); -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Bold'), - url('STIXTwoText-Bold.woff2'), - url('STIXTwoText-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Italic'), - url('STIXTwoText-Italic.woff2'), - url('STIXTwoText-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-BoldItalic'), - url('STIXTwoText-BoldItalic.woff2'), - url('STIXTwoText-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: STIX Two Math; - src: local('STIXTwoMath-Regular'), - url('STIXTwoMath-Regular.woff2'), - url('STIXTwoMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: STIX Two Text; -} -m|math { - font-family: STIX Two Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values STIX Two Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css deleted file mode 100644 index f7bbeaa0..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css +++ /dev/null @@ -1,62 +0,0 @@ -/* -The TeX Gyre Bonum fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Regular'), - url('texgyrebonum-regular.woff2'), url('texgyrebonum-regular.woff'); -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Bold'), - url('texgyrebonum-bold.woff2'), url('texgyrebonum-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Italic'), - url('texgyrebonum-italic.woff2'), url('texgyrebonum-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-BoldItalic'), - url('texgyrebonum-bolditalic.woff2'), - url('texgyrebonum-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum Math; - src: local('TeX Gyre Bonum Math'), local('TeXGyreBonumMath-Regular'), - url('texgyrebonum-math.woff2'), - url('texgyrebonum-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Bonum; -} -m|math { - font-family: TeX Gyre Bonum Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 deleted file mode 100644 index 013ca1bd..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 deleted file mode 100644 index ae18fb8b..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 deleted file mode 100644 index 42742390..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 deleted file mode 100644 index d16a1cea..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 deleted file mode 100644 index 8aede98d..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css deleted file mode 100644 index 394686b0..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css +++ /dev/null @@ -1,63 +0,0 @@ -/* -The TeX Gyre Pagella fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Regular'), - url('texgyrepagella-regular.woff2'), - url('texgyrepagella-regular.woff'); -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Bold'), - url('texgyrepagella-bold.woff2'), url('texgyrepagella-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Italic'), - url('texgyrepagella-italic.woff2'), url('texgyrepagella-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-BoldItalic'), - url('texgyrepagella-bolditalic.woff2'), - url('texgyrepagella-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella Math; - src: local('TeX Gyre Pagella Math'), local('TeXGyrePagellaMath-Regular'), - url('texgyrepagella-math.woff2'), - url('texgyrepagella-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Pagella; -} -m|math { - font-family: TeX Gyre Pagella Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 deleted file mode 100644 index 0879c80a..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css deleted file mode 100644 index 41c28c6b..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The TeX Gyre Schola fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Regular'), - url('texgyreschola-regular.woff2'), url('texgyreschola-regular.woff'); -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Bold'), - url('texgyreschola-bold.woff2'), url('texgyreschola-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Italic'), - url('texgyreschola-italic.woff2'), url('texgyreschola-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-BoldItalic'), - url('texgyreschola-bolditalic.woff2'), - url('texgyreschola-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola Math; - src: local('TeX Gyre Schola Math'), local('TeXGyreScholaMath-Regular'), - url('texgyreschola-math.woff2'), url('texgyreschola-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Schola; -} -m|math { - font-family: TeX Gyre Schola Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 deleted file mode 100644 index 485f2c5b..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 deleted file mode 100644 index 6c8c3f52..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 deleted file mode 100644 index afe8d4ef..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 deleted file mode 100644 index 674c4281..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 deleted file mode 100644 index 0dbec85e..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css deleted file mode 100644 index d7a65374..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css +++ /dev/null @@ -1,60 +0,0 @@ -/* -The TeX Gyre Termes fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Regular'), - url('texgyretermes-regular.woff2'), url('texgyretermes-regular.woff'); -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Bold'), - url('texgyretermes-bold.woff2'), url('texgyretermes-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Italic'), - url('texgyretermes-italic.woff2'), url('texgyretermes-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-BoldItalic'), - url('texgyretermes-bolditalic.woff2'), url('texgyretermes-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes Math; - src: local('TeX Gyre Termes Math'), local('TeXGyreTermesMath-Regular'), - url('texgyretermes-math.woff2'), url('texgyretermes-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Termes; -} -m|math { - font-family: TeX Gyre Termes Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 deleted file mode 100644 index a346eb13..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 deleted file mode 100644 index 571a2f07..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 deleted file mode 100644 index 401cd0ec..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 deleted file mode 100644 index 31c9adc2..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 deleted file mode 100644 index 1a15f9ad..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 deleted file mode 100644 index 7a12dd34..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 deleted file mode 100644 index c4daad18..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 deleted file mode 100644 index 9d434203..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 deleted file mode 100644 index 9acf905c..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 deleted file mode 100644 index c93f7230..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 deleted file mode 100644 index fa9345cb..00000000 Binary files a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 and /dev/null differ diff --git a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css b/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css deleted file mode 100644 index 9b62b7c3..00000000 --- a/erm.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -XITS is released under the SIL Open Font License. See the files in this -directory for details. The font can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://mirrors.ctan.org/fonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: XITS; - src: local('XITS'), - url('XITS-Regular.woff2'), url('XITS-Regular.woff'); -} -@font-face { - font-family: XITS; - src: local('XITS Bold'), local('XITS-Bold'), - url('XITS-Bold.woff2'), url('XITS-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: XITS; - src: local('XITS Italic'), local('XITS-Italic'), - url('XITS-Italic.woff2'), url('XITS-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: XITS; - src: local('XITS Bold Italic'), local('XITS-BoldItalic'), - url('XITS-BoldItalic.woff2'), url('XITS-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: XITS Math; - src: local('XITS Math'), local('XITSMath-Regular'), - url('XITSMath-Regular.woff2'), url('XITSMath-Regular.woff'); -} -@font-face { - font-family: XITS Math; - src: local('XITS Math Bold'), local('XITSMath-Bold'), - url('XITSMath-Bold.woff2'), url('XITSMathBold.woff'); - font-weight: bold; -} - -.htmlmathparagraph, m|mtext { - font-family: XITS; -} -m|math { - font-family: XITS Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values XITS Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/gradle.properties b/gradle.properties index 1456d087..d2708327 100644 --- a/gradle.properties +++ b/gradle.properties @@ -36,9 +36,9 @@ application_version=1.0.0 # platform ########################################################### platform_group=io.sc -platform_version=8.1.44 -platform_plugin_version=8.1.44 -platform_core_frontend_version=8.1.288 +platform_version=8.1.46 +platform_plugin_version=8.1.46 +platform_core_frontend_version=8.1.295 ########################################################### # dependencies version diff --git a/io.sc.engine.mv.frontend/package.json b/io.sc.engine.mv.frontend/package.json index b8426166..f2974676 100644 --- a/io.sc.engine.mv.frontend/package.json +++ b/io.sc.engine.mv.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.mv.frontend", - "version": "8.1.44", + "version": "8.1.46", "description": "", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.287", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/io.sc.engine.mv.frontend/public/configure.js b/io.sc.engine.mv.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.engine.mv.frontend/public/configure.js +++ b/io.sc.engine.mv.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css deleted file mode 100644 index bcbb5386..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css +++ /dev/null @@ -1,56 +0,0 @@ -/* -The proprietary Cambria fonts are installed by default on Microsoft Windows 7 -and higher and are provided with some other Microsoft products such as Office. -Some Web services may also provide them as Web fonts. For details, see - http://www.microsoft.com/typography/fonts/family.aspx?FID=291 - http://www.microsoft.com/typography/fonts/family.aspx?FID=360 -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Cambria; - src: local('Cambria'), url('...'); -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold'), url('...'); - font-weight: bold; -} -@font-face { - font-family: Cambria; - src: local('Cambria Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold Italic'), url('...'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Cambria Math; - src: local('Cambria Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Cambria; -} -m|math { - font-family: Cambria Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 deleted file mode 100644 index c74b7517..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 deleted file mode 100644 index c3620b3b..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 deleted file mode 100644 index 3d641e3d..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 deleted file mode 100644 index 163819b5..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 deleted file mode 100644 index 51776932..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css deleted file mode 100644 index ee48b1d3..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css +++ /dev/null @@ -1,51 +0,0 @@ -/* -Deja Vu is released under a Free License. See the files in this directory -for details. This fonts is available on most Linux distributions. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: DejaVu Math TeX Gyre; - src: url('DejaVuMathTeXGyre.woff2'), url('DejaVuMathTeXGyre.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif.woff2'), url('DejaVuSerif.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Bold.woff2'), url('DejaVuSerif-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Italic.woff2'), url('DejaVuSerif-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-BoldItalic.woff2'), - url('DejaVuSerif-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: DejaVu Serif; -} -m|math { - font-family: DejaVu Math TeX Gyre; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 deleted file mode 100644 index c13030cd..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css deleted file mode 100644 index c05d74d6..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -The FiraMath font is released under the SIL Open Font License. See the files in -this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Fira Math; - src: local('Fira Math'), local('FiraMath-Regular'), - url('FiraMath-Regular.woff2'), url('FiraMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - /* TODO: use FiraGO instead? */ - font-family: Fira Math; -} -m|math { - font-family: Fira Math; -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 deleted file mode 100644 index 3c27d39f..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 deleted file mode 100644 index e946d53e..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 deleted file mode 100644 index 0dd7d2ed..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 deleted file mode 100644 index e7dfb1d1..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 deleted file mode 100644 index 2c488f2a..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css deleted file mode 100644 index ea0116c9..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css +++ /dev/null @@ -1,50 +0,0 @@ -/* -The GFS Neohellenic fonts are released under the SIL Open Font License. See the -files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Regular'), - url('GFSNeohellenic.woff2'), - url('GFSNeohellenic.woff'); -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Bold'), - url('GFSNeohellenic-Bold.woff2'), - url('GFSNeohellenic-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Italic'), - url('GFSNeohellenic-It.woff2'), - url('GFSNeohellenic-It.woff'); - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-BoldItalic'), - url('GFSNeohellenic-BoldIt.woff2'), - url('GFSNeohellenic-BoldIt.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic Math; - src: local('GFSNeohellenicMath'), - url('GFSNeohellenicMath.woff2'), - url('GFSNeohellenicMath.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: GFS Neohellenic; -} -m|math { - font-family: GFS Neohellenic Math; -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css deleted file mode 100644 index cbf76d3d..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSans is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSans; - src: url('FreeSans.woff2'), url('FreeSans.woff'); -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBold.woff2'), url('FreeSansBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansOblique.woff2'), url('FreeSansOblique.woff'); - font-style: oblique; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBoldOblique.woff2'), url('FreeSansBoldOblique.woff'); - font-weight: bold; - font-style: oblique; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSans; -} -m|math { - font-family: FreeSans; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css deleted file mode 100644 index 9572fbfe..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSerif is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSerif; - src: url('FreeSerif.woff2'), url('FreeSerif.woff'); -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBold.woff2'), url('FreeSerifBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifItalic.woff2'), url('FreeSerifItalic.woff'); - font-style: italic; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBoldItalic.woff2'), url('FreeSerifBoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSerif; -} -m|math { - font-family: FreeSerif; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 deleted file mode 100644 index 21fe6278..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 deleted file mode 100644 index 9d8c372e..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 deleted file mode 100644 index 72102330..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css deleted file mode 100644 index f8b1e9df..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css +++ /dev/null @@ -1,35 +0,0 @@ -/* -The Garamond fonts are released under the SIL Open Font License. See the files -in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Regular'), - url('EBGaramond12-Regular.woff2'), - url('EBGaramond12-Regular.woff'); -} -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Italic'), - url('EBGaramond12-Italic.woff2'), - url('EBGaramond12-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: Garamond Math; - src: local('Garamond-Math'), - url('Garamond-Math.woff2'), - url('Garamond-Math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: EB Garamond; -} -m|math { - font-family: Garamond Math; -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 deleted file mode 100644 index 6110b17b..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 deleted file mode 100644 index df169efa..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 deleted file mode 100644 index c4ef3ed4..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 deleted file mode 100644 index ae0f344e..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css deleted file mode 100644 index b4b0ceeb..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css +++ /dev/null @@ -1,53 +0,0 @@ -/* -The Latin Modern fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Latin Modern Roman has various sizes. We use the generic name - "Latin Modern Roman" for the local versions and "LMRoman12" for the Web font. -*/ -@font-face { - font-family: LMRoman12; - src: url('lmroman12-regular.woff2'), url('lmroman12-regular.woff'); -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-bold.woff2'), url('lmroman12-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-italic.woff2'), url('lmroman12-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Latin Modern Math; - src: local('Latin Modern Math'), local('LatinModernMath-Regular'), - url('latinmodern-math.woff2'), url('latinmodern-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Latin Modern Roman, LMRoman12; -} -m|math { - font-family: Latin Modern Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 deleted file mode 100644 index c76bab8c..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 deleted file mode 100644 index 34b9f93b..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 deleted file mode 100644 index 19fbf7b9..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 deleted file mode 100644 index dd20fdcf..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 deleted file mode 100644 index a7ef60ef..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css deleted file mode 100644 index fe6d41c2..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The Libertinus fonts are released under the SIL Open Font and GPL Licenses. See -the files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif'), local('LibertinusSerif'), - url('libertinusserif-regular.woff2'), - url('libertinusserif-regular.woff'); -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold'), local('LibertinusSerif-Bold'), - url('libertinusserif-bold.woff2'), - url('libertinusserif-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Italic'), local('LibertinusSerif-Italic'), - url('libertinusserif-italic.woff2'), - url('libertinusserif-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold Italic'), - local('LibertinusSerif-BoldItalic'), - url('libertinusserif-bolditalic.woff2'), - url('libertinusserif-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Libertinus Math; - src: local('Libertinus Math'), local('LibertinusMath'), - url('libertinusmath-regular.woff2'), - url('libertinusmath-regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Libertinus Serif; -} -m|math { - font-family: Libertinus Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* No math script */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css deleted file mode 100644 index 5f056577..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css +++ /dev/null @@ -1,58 +0,0 @@ -/* -The commercial Lucida Bright fonts can be obtained from -http://tug.org/store/lucida/opentype.html and some Web services might -provide them as Web fonts. See also - http://www.microsoft.com/typography/fonts/family.aspx?FID=186 - http://www.microsoft.com/typography/fonts/family.aspx?FID=217 - -Warning: The CSS rules below have not been tested. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright'), url('...'); -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold'), url('...'); - font-weight: bolder; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold Italic'), url('...'); - font-weight: bolder; - font-style: italic; -} -@font-face { - font-family: Lucida Bright Math; - src: local('Lucida Bright Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Lucida Bright; -} -m|math { - font-family: Lucida Bright Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css deleted file mode 100644 index 640b0eaf..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css +++ /dev/null @@ -1,37 +0,0 @@ -/* -The commercial Minion Math fonts and can be obtained from -http://www.typoma.com/en/fonts.html and some Web services might provide them as -Web fonts. - -Warning: The CSS rules below have not been tested. More rules should probably -be added to make this work correctly. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Minion Math; - src: local('Minion Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Minion Math; -} -m|math { - font-family: Minion Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css deleted file mode 100644 index 8df86bf5..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css +++ /dev/null @@ -1,34 +0,0 @@ -/* -Neo Euler is released under the SIL Open Font License. See the files in this -directory for details. The font is still in development. The font does not seem -to have a corresponding "non-MATH" font. - -The WOFF fonts have been obtained from -https://github.com/khaledhosny/euler-otf/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Neo Euler; - src: local('Neo Euler'), url('euler.woff2'), url('euler.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Neo Euler; -} -m|math { - font-family: Neo Euler; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 deleted file mode 100644 index 279a98f0..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 deleted file mode 100644 index e4394884..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 deleted file mode 100644 index 0dc0baed..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 deleted file mode 100644 index 5594de32..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 deleted file mode 100644 index 263c488a..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css deleted file mode 100644 index 4b287cee..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -The STIX fonts are released under the SIL Open Font License. See the files in -this directory for details. The font can be obtained from several TeX -distributions or package managers. - -The WOFF fonts have been obtained from -http://downloads.sourceforge.net/project/stixfonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText'), - url('STIXTwoText-Regular.woff2'), - url('STIXTwoText-Regular.woff'); -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Bold'), - url('STIXTwoText-Bold.woff2'), - url('STIXTwoText-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Italic'), - url('STIXTwoText-Italic.woff2'), - url('STIXTwoText-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-BoldItalic'), - url('STIXTwoText-BoldItalic.woff2'), - url('STIXTwoText-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: STIX Two Math; - src: local('STIXTwoMath-Regular'), - url('STIXTwoMath-Regular.woff2'), - url('STIXTwoMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: STIX Two Text; -} -m|math { - font-family: STIX Two Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values STIX Two Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css deleted file mode 100644 index f7bbeaa0..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css +++ /dev/null @@ -1,62 +0,0 @@ -/* -The TeX Gyre Bonum fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Regular'), - url('texgyrebonum-regular.woff2'), url('texgyrebonum-regular.woff'); -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Bold'), - url('texgyrebonum-bold.woff2'), url('texgyrebonum-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Italic'), - url('texgyrebonum-italic.woff2'), url('texgyrebonum-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-BoldItalic'), - url('texgyrebonum-bolditalic.woff2'), - url('texgyrebonum-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum Math; - src: local('TeX Gyre Bonum Math'), local('TeXGyreBonumMath-Regular'), - url('texgyrebonum-math.woff2'), - url('texgyrebonum-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Bonum; -} -m|math { - font-family: TeX Gyre Bonum Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 deleted file mode 100644 index 013ca1bd..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 deleted file mode 100644 index ae18fb8b..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 deleted file mode 100644 index 42742390..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 deleted file mode 100644 index d16a1cea..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 deleted file mode 100644 index 8aede98d..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css deleted file mode 100644 index 394686b0..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css +++ /dev/null @@ -1,63 +0,0 @@ -/* -The TeX Gyre Pagella fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Regular'), - url('texgyrepagella-regular.woff2'), - url('texgyrepagella-regular.woff'); -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Bold'), - url('texgyrepagella-bold.woff2'), url('texgyrepagella-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Italic'), - url('texgyrepagella-italic.woff2'), url('texgyrepagella-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-BoldItalic'), - url('texgyrepagella-bolditalic.woff2'), - url('texgyrepagella-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella Math; - src: local('TeX Gyre Pagella Math'), local('TeXGyrePagellaMath-Regular'), - url('texgyrepagella-math.woff2'), - url('texgyrepagella-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Pagella; -} -m|math { - font-family: TeX Gyre Pagella Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 deleted file mode 100644 index 0879c80a..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css deleted file mode 100644 index 41c28c6b..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The TeX Gyre Schola fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Regular'), - url('texgyreschola-regular.woff2'), url('texgyreschola-regular.woff'); -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Bold'), - url('texgyreschola-bold.woff2'), url('texgyreschola-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Italic'), - url('texgyreschola-italic.woff2'), url('texgyreschola-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-BoldItalic'), - url('texgyreschola-bolditalic.woff2'), - url('texgyreschola-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola Math; - src: local('TeX Gyre Schola Math'), local('TeXGyreScholaMath-Regular'), - url('texgyreschola-math.woff2'), url('texgyreschola-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Schola; -} -m|math { - font-family: TeX Gyre Schola Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 deleted file mode 100644 index 485f2c5b..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 deleted file mode 100644 index 6c8c3f52..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 deleted file mode 100644 index afe8d4ef..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 deleted file mode 100644 index 674c4281..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 deleted file mode 100644 index 0dbec85e..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css deleted file mode 100644 index d7a65374..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css +++ /dev/null @@ -1,60 +0,0 @@ -/* -The TeX Gyre Termes fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Regular'), - url('texgyretermes-regular.woff2'), url('texgyretermes-regular.woff'); -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Bold'), - url('texgyretermes-bold.woff2'), url('texgyretermes-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Italic'), - url('texgyretermes-italic.woff2'), url('texgyretermes-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-BoldItalic'), - url('texgyretermes-bolditalic.woff2'), url('texgyretermes-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes Math; - src: local('TeX Gyre Termes Math'), local('TeXGyreTermesMath-Regular'), - url('texgyretermes-math.woff2'), url('texgyretermes-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Termes; -} -m|math { - font-family: TeX Gyre Termes Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 deleted file mode 100644 index a346eb13..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 deleted file mode 100644 index 571a2f07..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 deleted file mode 100644 index 401cd0ec..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 deleted file mode 100644 index 31c9adc2..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 deleted file mode 100644 index 1a15f9ad..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 deleted file mode 100644 index 7a12dd34..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 deleted file mode 100644 index c4daad18..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 deleted file mode 100644 index 9d434203..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 deleted file mode 100644 index 9acf905c..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 deleted file mode 100644 index c93f7230..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 deleted file mode 100644 index fa9345cb..00000000 Binary files a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css b/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css deleted file mode 100644 index 9b62b7c3..00000000 --- a/io.sc.engine.mv.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -XITS is released under the SIL Open Font License. See the files in this -directory for details. The font can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://mirrors.ctan.org/fonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: XITS; - src: local('XITS'), - url('XITS-Regular.woff2'), url('XITS-Regular.woff'); -} -@font-face { - font-family: XITS; - src: local('XITS Bold'), local('XITS-Bold'), - url('XITS-Bold.woff2'), url('XITS-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: XITS; - src: local('XITS Italic'), local('XITS-Italic'), - url('XITS-Italic.woff2'), url('XITS-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: XITS; - src: local('XITS Bold Italic'), local('XITS-BoldItalic'), - url('XITS-BoldItalic.woff2'), url('XITS-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: XITS Math; - src: local('XITS Math'), local('XITSMath-Regular'), - url('XITSMath-Regular.woff2'), url('XITSMath-Regular.woff'); -} -@font-face { - font-family: XITS Math; - src: local('XITS Math Bold'), local('XITSMath-Bold'), - url('XITSMath-Bold.woff2'), url('XITSMathBold.woff'); - font-weight: bold; -} - -.htmlmathparagraph, m|mtext { - font-family: XITS; -} -m|math { - font-family: XITS Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values XITS Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.engine.mv/build.gradle b/io.sc.engine.mv/build.gradle index 5a637401..35b1bd64 100644 --- a/io.sc.engine.mv/build.gradle +++ b/io.sc.engine.mv/build.gradle @@ -1,9 +1,7 @@ dependencies { api( -// "io.sc:io.sc.platform.groovy:${platform_version}", -// "io.sc:io.sc.platform.system:${platform_version}", - project(":io.sc.platform.groovy"), - project(":io.sc.platform.data"), - project(":io.sc.platform.system"), + project(":io.sc.platform.groovy"), + project(":io.sc.platform.data"), + project(":io.sc.platform.system"), ) } diff --git a/io.sc.engine.rule.frontend/package.json b/io.sc.engine.rule.frontend/package.json index beac6faf..4eb9d7e2 100644 --- a/io.sc.engine.rule.frontend/package.json +++ b/io.sc.engine.rule.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.rule.frontend", - "version": "8.1.44", + "version": "8.1.46", "description": "", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.287", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/io.sc.engine.rule.frontend/public/configure.js b/io.sc.engine.rule.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.engine.rule.frontend/public/configure.js +++ b/io.sc.engine.rule.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css deleted file mode 100644 index bcbb5386..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css +++ /dev/null @@ -1,56 +0,0 @@ -/* -The proprietary Cambria fonts are installed by default on Microsoft Windows 7 -and higher and are provided with some other Microsoft products such as Office. -Some Web services may also provide them as Web fonts. For details, see - http://www.microsoft.com/typography/fonts/family.aspx?FID=291 - http://www.microsoft.com/typography/fonts/family.aspx?FID=360 -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Cambria; - src: local('Cambria'), url('...'); -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold'), url('...'); - font-weight: bold; -} -@font-face { - font-family: Cambria; - src: local('Cambria Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold Italic'), url('...'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Cambria Math; - src: local('Cambria Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Cambria; -} -m|math { - font-family: Cambria Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 deleted file mode 100644 index c74b7517..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 deleted file mode 100644 index c3620b3b..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 deleted file mode 100644 index 3d641e3d..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 deleted file mode 100644 index 163819b5..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 deleted file mode 100644 index 51776932..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css deleted file mode 100644 index ee48b1d3..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css +++ /dev/null @@ -1,51 +0,0 @@ -/* -Deja Vu is released under a Free License. See the files in this directory -for details. This fonts is available on most Linux distributions. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: DejaVu Math TeX Gyre; - src: url('DejaVuMathTeXGyre.woff2'), url('DejaVuMathTeXGyre.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif.woff2'), url('DejaVuSerif.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Bold.woff2'), url('DejaVuSerif-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Italic.woff2'), url('DejaVuSerif-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-BoldItalic.woff2'), - url('DejaVuSerif-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: DejaVu Serif; -} -m|math { - font-family: DejaVu Math TeX Gyre; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 deleted file mode 100644 index c13030cd..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css deleted file mode 100644 index c05d74d6..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -The FiraMath font is released under the SIL Open Font License. See the files in -this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Fira Math; - src: local('Fira Math'), local('FiraMath-Regular'), - url('FiraMath-Regular.woff2'), url('FiraMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - /* TODO: use FiraGO instead? */ - font-family: Fira Math; -} -m|math { - font-family: Fira Math; -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 deleted file mode 100644 index 3c27d39f..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 deleted file mode 100644 index e946d53e..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 deleted file mode 100644 index 0dd7d2ed..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 deleted file mode 100644 index e7dfb1d1..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 deleted file mode 100644 index 2c488f2a..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css deleted file mode 100644 index ea0116c9..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css +++ /dev/null @@ -1,50 +0,0 @@ -/* -The GFS Neohellenic fonts are released under the SIL Open Font License. See the -files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Regular'), - url('GFSNeohellenic.woff2'), - url('GFSNeohellenic.woff'); -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Bold'), - url('GFSNeohellenic-Bold.woff2'), - url('GFSNeohellenic-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Italic'), - url('GFSNeohellenic-It.woff2'), - url('GFSNeohellenic-It.woff'); - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-BoldItalic'), - url('GFSNeohellenic-BoldIt.woff2'), - url('GFSNeohellenic-BoldIt.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic Math; - src: local('GFSNeohellenicMath'), - url('GFSNeohellenicMath.woff2'), - url('GFSNeohellenicMath.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: GFS Neohellenic; -} -m|math { - font-family: GFS Neohellenic Math; -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css deleted file mode 100644 index cbf76d3d..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSans is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSans; - src: url('FreeSans.woff2'), url('FreeSans.woff'); -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBold.woff2'), url('FreeSansBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansOblique.woff2'), url('FreeSansOblique.woff'); - font-style: oblique; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBoldOblique.woff2'), url('FreeSansBoldOblique.woff'); - font-weight: bold; - font-style: oblique; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSans; -} -m|math { - font-family: FreeSans; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css deleted file mode 100644 index 9572fbfe..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSerif is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSerif; - src: url('FreeSerif.woff2'), url('FreeSerif.woff'); -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBold.woff2'), url('FreeSerifBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifItalic.woff2'), url('FreeSerifItalic.woff'); - font-style: italic; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBoldItalic.woff2'), url('FreeSerifBoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSerif; -} -m|math { - font-family: FreeSerif; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 deleted file mode 100644 index 21fe6278..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 deleted file mode 100644 index 9d8c372e..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 deleted file mode 100644 index 72102330..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css deleted file mode 100644 index f8b1e9df..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css +++ /dev/null @@ -1,35 +0,0 @@ -/* -The Garamond fonts are released under the SIL Open Font License. See the files -in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Regular'), - url('EBGaramond12-Regular.woff2'), - url('EBGaramond12-Regular.woff'); -} -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Italic'), - url('EBGaramond12-Italic.woff2'), - url('EBGaramond12-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: Garamond Math; - src: local('Garamond-Math'), - url('Garamond-Math.woff2'), - url('Garamond-Math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: EB Garamond; -} -m|math { - font-family: Garamond Math; -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 deleted file mode 100644 index 6110b17b..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 deleted file mode 100644 index df169efa..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 deleted file mode 100644 index c4ef3ed4..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 deleted file mode 100644 index ae0f344e..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css deleted file mode 100644 index b4b0ceeb..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css +++ /dev/null @@ -1,53 +0,0 @@ -/* -The Latin Modern fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Latin Modern Roman has various sizes. We use the generic name - "Latin Modern Roman" for the local versions and "LMRoman12" for the Web font. -*/ -@font-face { - font-family: LMRoman12; - src: url('lmroman12-regular.woff2'), url('lmroman12-regular.woff'); -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-bold.woff2'), url('lmroman12-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-italic.woff2'), url('lmroman12-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Latin Modern Math; - src: local('Latin Modern Math'), local('LatinModernMath-Regular'), - url('latinmodern-math.woff2'), url('latinmodern-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Latin Modern Roman, LMRoman12; -} -m|math { - font-family: Latin Modern Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 deleted file mode 100644 index c76bab8c..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 deleted file mode 100644 index 34b9f93b..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 deleted file mode 100644 index 19fbf7b9..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 deleted file mode 100644 index dd20fdcf..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 deleted file mode 100644 index a7ef60ef..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css deleted file mode 100644 index fe6d41c2..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The Libertinus fonts are released under the SIL Open Font and GPL Licenses. See -the files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif'), local('LibertinusSerif'), - url('libertinusserif-regular.woff2'), - url('libertinusserif-regular.woff'); -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold'), local('LibertinusSerif-Bold'), - url('libertinusserif-bold.woff2'), - url('libertinusserif-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Italic'), local('LibertinusSerif-Italic'), - url('libertinusserif-italic.woff2'), - url('libertinusserif-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold Italic'), - local('LibertinusSerif-BoldItalic'), - url('libertinusserif-bolditalic.woff2'), - url('libertinusserif-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Libertinus Math; - src: local('Libertinus Math'), local('LibertinusMath'), - url('libertinusmath-regular.woff2'), - url('libertinusmath-regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Libertinus Serif; -} -m|math { - font-family: Libertinus Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* No math script */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css deleted file mode 100644 index 5f056577..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css +++ /dev/null @@ -1,58 +0,0 @@ -/* -The commercial Lucida Bright fonts can be obtained from -http://tug.org/store/lucida/opentype.html and some Web services might -provide them as Web fonts. See also - http://www.microsoft.com/typography/fonts/family.aspx?FID=186 - http://www.microsoft.com/typography/fonts/family.aspx?FID=217 - -Warning: The CSS rules below have not been tested. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright'), url('...'); -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold'), url('...'); - font-weight: bolder; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold Italic'), url('...'); - font-weight: bolder; - font-style: italic; -} -@font-face { - font-family: Lucida Bright Math; - src: local('Lucida Bright Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Lucida Bright; -} -m|math { - font-family: Lucida Bright Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css deleted file mode 100644 index 640b0eaf..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css +++ /dev/null @@ -1,37 +0,0 @@ -/* -The commercial Minion Math fonts and can be obtained from -http://www.typoma.com/en/fonts.html and some Web services might provide them as -Web fonts. - -Warning: The CSS rules below have not been tested. More rules should probably -be added to make this work correctly. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Minion Math; - src: local('Minion Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Minion Math; -} -m|math { - font-family: Minion Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css deleted file mode 100644 index 8df86bf5..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css +++ /dev/null @@ -1,34 +0,0 @@ -/* -Neo Euler is released under the SIL Open Font License. See the files in this -directory for details. The font is still in development. The font does not seem -to have a corresponding "non-MATH" font. - -The WOFF fonts have been obtained from -https://github.com/khaledhosny/euler-otf/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Neo Euler; - src: local('Neo Euler'), url('euler.woff2'), url('euler.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Neo Euler; -} -m|math { - font-family: Neo Euler; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 deleted file mode 100644 index 279a98f0..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 deleted file mode 100644 index e4394884..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 deleted file mode 100644 index 0dc0baed..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 deleted file mode 100644 index 5594de32..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 deleted file mode 100644 index 263c488a..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css deleted file mode 100644 index 4b287cee..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -The STIX fonts are released under the SIL Open Font License. See the files in -this directory for details. The font can be obtained from several TeX -distributions or package managers. - -The WOFF fonts have been obtained from -http://downloads.sourceforge.net/project/stixfonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText'), - url('STIXTwoText-Regular.woff2'), - url('STIXTwoText-Regular.woff'); -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Bold'), - url('STIXTwoText-Bold.woff2'), - url('STIXTwoText-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Italic'), - url('STIXTwoText-Italic.woff2'), - url('STIXTwoText-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-BoldItalic'), - url('STIXTwoText-BoldItalic.woff2'), - url('STIXTwoText-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: STIX Two Math; - src: local('STIXTwoMath-Regular'), - url('STIXTwoMath-Regular.woff2'), - url('STIXTwoMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: STIX Two Text; -} -m|math { - font-family: STIX Two Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values STIX Two Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css deleted file mode 100644 index f7bbeaa0..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css +++ /dev/null @@ -1,62 +0,0 @@ -/* -The TeX Gyre Bonum fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Regular'), - url('texgyrebonum-regular.woff2'), url('texgyrebonum-regular.woff'); -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Bold'), - url('texgyrebonum-bold.woff2'), url('texgyrebonum-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Italic'), - url('texgyrebonum-italic.woff2'), url('texgyrebonum-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-BoldItalic'), - url('texgyrebonum-bolditalic.woff2'), - url('texgyrebonum-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum Math; - src: local('TeX Gyre Bonum Math'), local('TeXGyreBonumMath-Regular'), - url('texgyrebonum-math.woff2'), - url('texgyrebonum-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Bonum; -} -m|math { - font-family: TeX Gyre Bonum Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 deleted file mode 100644 index 013ca1bd..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 deleted file mode 100644 index ae18fb8b..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 deleted file mode 100644 index 42742390..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 deleted file mode 100644 index d16a1cea..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 deleted file mode 100644 index 8aede98d..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css deleted file mode 100644 index 394686b0..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css +++ /dev/null @@ -1,63 +0,0 @@ -/* -The TeX Gyre Pagella fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Regular'), - url('texgyrepagella-regular.woff2'), - url('texgyrepagella-regular.woff'); -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Bold'), - url('texgyrepagella-bold.woff2'), url('texgyrepagella-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Italic'), - url('texgyrepagella-italic.woff2'), url('texgyrepagella-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-BoldItalic'), - url('texgyrepagella-bolditalic.woff2'), - url('texgyrepagella-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella Math; - src: local('TeX Gyre Pagella Math'), local('TeXGyrePagellaMath-Regular'), - url('texgyrepagella-math.woff2'), - url('texgyrepagella-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Pagella; -} -m|math { - font-family: TeX Gyre Pagella Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 deleted file mode 100644 index 0879c80a..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css deleted file mode 100644 index 41c28c6b..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The TeX Gyre Schola fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Regular'), - url('texgyreschola-regular.woff2'), url('texgyreschola-regular.woff'); -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Bold'), - url('texgyreschola-bold.woff2'), url('texgyreschola-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Italic'), - url('texgyreschola-italic.woff2'), url('texgyreschola-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-BoldItalic'), - url('texgyreschola-bolditalic.woff2'), - url('texgyreschola-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola Math; - src: local('TeX Gyre Schola Math'), local('TeXGyreScholaMath-Regular'), - url('texgyreschola-math.woff2'), url('texgyreschola-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Schola; -} -m|math { - font-family: TeX Gyre Schola Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 deleted file mode 100644 index 485f2c5b..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 deleted file mode 100644 index 6c8c3f52..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 deleted file mode 100644 index afe8d4ef..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 deleted file mode 100644 index 674c4281..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 deleted file mode 100644 index 0dbec85e..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css deleted file mode 100644 index d7a65374..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css +++ /dev/null @@ -1,60 +0,0 @@ -/* -The TeX Gyre Termes fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Regular'), - url('texgyretermes-regular.woff2'), url('texgyretermes-regular.woff'); -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Bold'), - url('texgyretermes-bold.woff2'), url('texgyretermes-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Italic'), - url('texgyretermes-italic.woff2'), url('texgyretermes-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-BoldItalic'), - url('texgyretermes-bolditalic.woff2'), url('texgyretermes-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes Math; - src: local('TeX Gyre Termes Math'), local('TeXGyreTermesMath-Regular'), - url('texgyretermes-math.woff2'), url('texgyretermes-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Termes; -} -m|math { - font-family: TeX Gyre Termes Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 deleted file mode 100644 index a346eb13..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 deleted file mode 100644 index 571a2f07..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 deleted file mode 100644 index 401cd0ec..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 deleted file mode 100644 index 31c9adc2..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 deleted file mode 100644 index 1a15f9ad..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 deleted file mode 100644 index 7a12dd34..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 deleted file mode 100644 index c4daad18..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 deleted file mode 100644 index 9d434203..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 deleted file mode 100644 index 9acf905c..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 deleted file mode 100644 index c93f7230..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 deleted file mode 100644 index fa9345cb..00000000 Binary files a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css b/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css deleted file mode 100644 index 9b62b7c3..00000000 --- a/io.sc.engine.rule.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -XITS is released under the SIL Open Font License. See the files in this -directory for details. The font can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://mirrors.ctan.org/fonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: XITS; - src: local('XITS'), - url('XITS-Regular.woff2'), url('XITS-Regular.woff'); -} -@font-face { - font-family: XITS; - src: local('XITS Bold'), local('XITS-Bold'), - url('XITS-Bold.woff2'), url('XITS-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: XITS; - src: local('XITS Italic'), local('XITS-Italic'), - url('XITS-Italic.woff2'), url('XITS-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: XITS; - src: local('XITS Bold Italic'), local('XITS-BoldItalic'), - url('XITS-BoldItalic.woff2'), url('XITS-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: XITS Math; - src: local('XITS Math'), local('XITSMath-Regular'), - url('XITSMath-Regular.woff2'), url('XITSMath-Regular.woff'); -} -@font-face { - font-family: XITS Math; - src: local('XITS Math Bold'), local('XITSMath-Bold'), - url('XITSMath-Bold.woff2'), url('XITSMathBold.woff'); - font-weight: bold; -} - -.htmlmathparagraph, m|mtext { - font-family: XITS; -} -m|math { - font-family: XITS Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values XITS Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.engine.rule.frontend/src/components/index.ts b/io.sc.engine.rule.frontend/src/components/index.ts index 0956168b..83540968 100644 --- a/io.sc.engine.rule.frontend/src/components/index.ts +++ b/io.sc.engine.rule.frontend/src/components/index.ts @@ -11,8 +11,6 @@ import component_engine_rule_lib from '@/views/lib/Lib.vue'; import component_engine_rule_function from '@/views/function/Function.vue'; import component_engine_rule_testcase from '@/views/testcase/Testcase.vue'; import component_engine_rule_migration from '@/views/migration/Migration.vue'; -import component_engine_rule_report from '@/views/report/tzblwdxfxbb.vue'; -import component_engine_rule_report2 from '@/views/report/tzblwoeivbb.vue'; const localComponents = { 'component.engine.rule.resources': component_engine_rule_resources, @@ -24,8 +22,6 @@ const localComponents = { 'component.engine.rule.function': component_engine_rule_function, 'component.engine.rule.testcase': component_engine_rule_testcase, 'component.engine.rule.migration': component_engine_rule_migration, - 'component.engine.rule.report': component_engine_rule_report, - 'component.engine.rule.report2': component_engine_rule_report2, }; export default localComponents; diff --git a/io.sc.engine.rule.server/build.gradle b/io.sc.engine.rule.server/build.gradle index 0a800aa7..446555f5 100644 --- a/io.sc.engine.rule.server/build.gradle +++ b/io.sc.engine.rule.server/build.gradle @@ -12,12 +12,6 @@ dependencies { project(":io.sc.engine.rule.client"), project(":io.sc.engine.rule.client.spring"), project(":io.sc.engine.rule.frontend"), - - "org.webjars:org.webjars.codemirror:5.37.0", - "org.webjars:org.webjars.mxgraph:3.9.12", - "org.webjars:org.webjars.jquery:1.12.4", - "org.webjars:org.webjars.mathfonts:1.0.0", - "org.webjars:org.webjars.mathcss:1.0.0", ) } diff --git a/io.sc.engine.st.frontend/package.json b/io.sc.engine.st.frontend/package.json index 34787774..b21dc20b 100644 --- a/io.sc.engine.st.frontend/package.json +++ b/io.sc.engine.st.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.engine.st.frontend", - "version": "8.1.44", + "version": "8.1.46", "description": "", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.287", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/io.sc.engine.st.frontend/public/configure.js b/io.sc.engine.st.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.engine.st.frontend/public/configure.js +++ b/io.sc.engine.st.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css deleted file mode 100644 index bcbb5386..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css +++ /dev/null @@ -1,56 +0,0 @@ -/* -The proprietary Cambria fonts are installed by default on Microsoft Windows 7 -and higher and are provided with some other Microsoft products such as Office. -Some Web services may also provide them as Web fonts. For details, see - http://www.microsoft.com/typography/fonts/family.aspx?FID=291 - http://www.microsoft.com/typography/fonts/family.aspx?FID=360 -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Cambria; - src: local('Cambria'), url('...'); -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold'), url('...'); - font-weight: bold; -} -@font-face { - font-family: Cambria; - src: local('Cambria Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold Italic'), url('...'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Cambria Math; - src: local('Cambria Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Cambria; -} -m|math { - font-family: Cambria Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 deleted file mode 100644 index c74b7517..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 deleted file mode 100644 index c3620b3b..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 deleted file mode 100644 index 3d641e3d..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 deleted file mode 100644 index 163819b5..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 deleted file mode 100644 index 51776932..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css deleted file mode 100644 index ee48b1d3..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css +++ /dev/null @@ -1,51 +0,0 @@ -/* -Deja Vu is released under a Free License. See the files in this directory -for details. This fonts is available on most Linux distributions. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: DejaVu Math TeX Gyre; - src: url('DejaVuMathTeXGyre.woff2'), url('DejaVuMathTeXGyre.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif.woff2'), url('DejaVuSerif.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Bold.woff2'), url('DejaVuSerif-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Italic.woff2'), url('DejaVuSerif-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-BoldItalic.woff2'), - url('DejaVuSerif-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: DejaVu Serif; -} -m|math { - font-family: DejaVu Math TeX Gyre; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 deleted file mode 100644 index c13030cd..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css deleted file mode 100644 index c05d74d6..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -The FiraMath font is released under the SIL Open Font License. See the files in -this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Fira Math; - src: local('Fira Math'), local('FiraMath-Regular'), - url('FiraMath-Regular.woff2'), url('FiraMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - /* TODO: use FiraGO instead? */ - font-family: Fira Math; -} -m|math { - font-family: Fira Math; -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 deleted file mode 100644 index 3c27d39f..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 deleted file mode 100644 index e946d53e..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 deleted file mode 100644 index 0dd7d2ed..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 deleted file mode 100644 index e7dfb1d1..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 deleted file mode 100644 index 2c488f2a..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css deleted file mode 100644 index ea0116c9..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css +++ /dev/null @@ -1,50 +0,0 @@ -/* -The GFS Neohellenic fonts are released under the SIL Open Font License. See the -files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Regular'), - url('GFSNeohellenic.woff2'), - url('GFSNeohellenic.woff'); -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Bold'), - url('GFSNeohellenic-Bold.woff2'), - url('GFSNeohellenic-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Italic'), - url('GFSNeohellenic-It.woff2'), - url('GFSNeohellenic-It.woff'); - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-BoldItalic'), - url('GFSNeohellenic-BoldIt.woff2'), - url('GFSNeohellenic-BoldIt.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic Math; - src: local('GFSNeohellenicMath'), - url('GFSNeohellenicMath.woff2'), - url('GFSNeohellenicMath.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: GFS Neohellenic; -} -m|math { - font-family: GFS Neohellenic Math; -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css deleted file mode 100644 index cbf76d3d..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSans is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSans; - src: url('FreeSans.woff2'), url('FreeSans.woff'); -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBold.woff2'), url('FreeSansBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansOblique.woff2'), url('FreeSansOblique.woff'); - font-style: oblique; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBoldOblique.woff2'), url('FreeSansBoldOblique.woff'); - font-weight: bold; - font-style: oblique; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSans; -} -m|math { - font-family: FreeSans; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css deleted file mode 100644 index 9572fbfe..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSerif is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSerif; - src: url('FreeSerif.woff2'), url('FreeSerif.woff'); -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBold.woff2'), url('FreeSerifBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifItalic.woff2'), url('FreeSerifItalic.woff'); - font-style: italic; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBoldItalic.woff2'), url('FreeSerifBoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSerif; -} -m|math { - font-family: FreeSerif; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 deleted file mode 100644 index 21fe6278..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 deleted file mode 100644 index 9d8c372e..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 deleted file mode 100644 index 72102330..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css deleted file mode 100644 index f8b1e9df..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css +++ /dev/null @@ -1,35 +0,0 @@ -/* -The Garamond fonts are released under the SIL Open Font License. See the files -in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Regular'), - url('EBGaramond12-Regular.woff2'), - url('EBGaramond12-Regular.woff'); -} -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Italic'), - url('EBGaramond12-Italic.woff2'), - url('EBGaramond12-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: Garamond Math; - src: local('Garamond-Math'), - url('Garamond-Math.woff2'), - url('Garamond-Math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: EB Garamond; -} -m|math { - font-family: Garamond Math; -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 deleted file mode 100644 index 6110b17b..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 deleted file mode 100644 index df169efa..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 deleted file mode 100644 index c4ef3ed4..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 deleted file mode 100644 index ae0f344e..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css deleted file mode 100644 index b4b0ceeb..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css +++ /dev/null @@ -1,53 +0,0 @@ -/* -The Latin Modern fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Latin Modern Roman has various sizes. We use the generic name - "Latin Modern Roman" for the local versions and "LMRoman12" for the Web font. -*/ -@font-face { - font-family: LMRoman12; - src: url('lmroman12-regular.woff2'), url('lmroman12-regular.woff'); -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-bold.woff2'), url('lmroman12-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-italic.woff2'), url('lmroman12-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Latin Modern Math; - src: local('Latin Modern Math'), local('LatinModernMath-Regular'), - url('latinmodern-math.woff2'), url('latinmodern-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Latin Modern Roman, LMRoman12; -} -m|math { - font-family: Latin Modern Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 deleted file mode 100644 index c76bab8c..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 deleted file mode 100644 index 34b9f93b..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 deleted file mode 100644 index 19fbf7b9..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 deleted file mode 100644 index dd20fdcf..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 deleted file mode 100644 index a7ef60ef..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css deleted file mode 100644 index fe6d41c2..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The Libertinus fonts are released under the SIL Open Font and GPL Licenses. See -the files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif'), local('LibertinusSerif'), - url('libertinusserif-regular.woff2'), - url('libertinusserif-regular.woff'); -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold'), local('LibertinusSerif-Bold'), - url('libertinusserif-bold.woff2'), - url('libertinusserif-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Italic'), local('LibertinusSerif-Italic'), - url('libertinusserif-italic.woff2'), - url('libertinusserif-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold Italic'), - local('LibertinusSerif-BoldItalic'), - url('libertinusserif-bolditalic.woff2'), - url('libertinusserif-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Libertinus Math; - src: local('Libertinus Math'), local('LibertinusMath'), - url('libertinusmath-regular.woff2'), - url('libertinusmath-regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Libertinus Serif; -} -m|math { - font-family: Libertinus Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* No math script */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css deleted file mode 100644 index 5f056577..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css +++ /dev/null @@ -1,58 +0,0 @@ -/* -The commercial Lucida Bright fonts can be obtained from -http://tug.org/store/lucida/opentype.html and some Web services might -provide them as Web fonts. See also - http://www.microsoft.com/typography/fonts/family.aspx?FID=186 - http://www.microsoft.com/typography/fonts/family.aspx?FID=217 - -Warning: The CSS rules below have not been tested. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright'), url('...'); -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold'), url('...'); - font-weight: bolder; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold Italic'), url('...'); - font-weight: bolder; - font-style: italic; -} -@font-face { - font-family: Lucida Bright Math; - src: local('Lucida Bright Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Lucida Bright; -} -m|math { - font-family: Lucida Bright Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css deleted file mode 100644 index 640b0eaf..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css +++ /dev/null @@ -1,37 +0,0 @@ -/* -The commercial Minion Math fonts and can be obtained from -http://www.typoma.com/en/fonts.html and some Web services might provide them as -Web fonts. - -Warning: The CSS rules below have not been tested. More rules should probably -be added to make this work correctly. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Minion Math; - src: local('Minion Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Minion Math; -} -m|math { - font-family: Minion Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css deleted file mode 100644 index 8df86bf5..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css +++ /dev/null @@ -1,34 +0,0 @@ -/* -Neo Euler is released under the SIL Open Font License. See the files in this -directory for details. The font is still in development. The font does not seem -to have a corresponding "non-MATH" font. - -The WOFF fonts have been obtained from -https://github.com/khaledhosny/euler-otf/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Neo Euler; - src: local('Neo Euler'), url('euler.woff2'), url('euler.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Neo Euler; -} -m|math { - font-family: Neo Euler; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 deleted file mode 100644 index 279a98f0..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 deleted file mode 100644 index e4394884..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 deleted file mode 100644 index 0dc0baed..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 deleted file mode 100644 index 5594de32..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 deleted file mode 100644 index 263c488a..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css deleted file mode 100644 index 4b287cee..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -The STIX fonts are released under the SIL Open Font License. See the files in -this directory for details. The font can be obtained from several TeX -distributions or package managers. - -The WOFF fonts have been obtained from -http://downloads.sourceforge.net/project/stixfonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText'), - url('STIXTwoText-Regular.woff2'), - url('STIXTwoText-Regular.woff'); -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Bold'), - url('STIXTwoText-Bold.woff2'), - url('STIXTwoText-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Italic'), - url('STIXTwoText-Italic.woff2'), - url('STIXTwoText-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-BoldItalic'), - url('STIXTwoText-BoldItalic.woff2'), - url('STIXTwoText-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: STIX Two Math; - src: local('STIXTwoMath-Regular'), - url('STIXTwoMath-Regular.woff2'), - url('STIXTwoMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: STIX Two Text; -} -m|math { - font-family: STIX Two Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values STIX Two Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css deleted file mode 100644 index f7bbeaa0..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css +++ /dev/null @@ -1,62 +0,0 @@ -/* -The TeX Gyre Bonum fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Regular'), - url('texgyrebonum-regular.woff2'), url('texgyrebonum-regular.woff'); -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Bold'), - url('texgyrebonum-bold.woff2'), url('texgyrebonum-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Italic'), - url('texgyrebonum-italic.woff2'), url('texgyrebonum-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-BoldItalic'), - url('texgyrebonum-bolditalic.woff2'), - url('texgyrebonum-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum Math; - src: local('TeX Gyre Bonum Math'), local('TeXGyreBonumMath-Regular'), - url('texgyrebonum-math.woff2'), - url('texgyrebonum-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Bonum; -} -m|math { - font-family: TeX Gyre Bonum Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 deleted file mode 100644 index 013ca1bd..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 deleted file mode 100644 index ae18fb8b..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 deleted file mode 100644 index 42742390..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 deleted file mode 100644 index d16a1cea..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 deleted file mode 100644 index 8aede98d..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css deleted file mode 100644 index 394686b0..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css +++ /dev/null @@ -1,63 +0,0 @@ -/* -The TeX Gyre Pagella fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Regular'), - url('texgyrepagella-regular.woff2'), - url('texgyrepagella-regular.woff'); -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Bold'), - url('texgyrepagella-bold.woff2'), url('texgyrepagella-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Italic'), - url('texgyrepagella-italic.woff2'), url('texgyrepagella-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-BoldItalic'), - url('texgyrepagella-bolditalic.woff2'), - url('texgyrepagella-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella Math; - src: local('TeX Gyre Pagella Math'), local('TeXGyrePagellaMath-Regular'), - url('texgyrepagella-math.woff2'), - url('texgyrepagella-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Pagella; -} -m|math { - font-family: TeX Gyre Pagella Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 deleted file mode 100644 index 0879c80a..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css deleted file mode 100644 index 41c28c6b..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The TeX Gyre Schola fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Regular'), - url('texgyreschola-regular.woff2'), url('texgyreschola-regular.woff'); -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Bold'), - url('texgyreschola-bold.woff2'), url('texgyreschola-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Italic'), - url('texgyreschola-italic.woff2'), url('texgyreschola-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-BoldItalic'), - url('texgyreschola-bolditalic.woff2'), - url('texgyreschola-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola Math; - src: local('TeX Gyre Schola Math'), local('TeXGyreScholaMath-Regular'), - url('texgyreschola-math.woff2'), url('texgyreschola-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Schola; -} -m|math { - font-family: TeX Gyre Schola Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 deleted file mode 100644 index 485f2c5b..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 deleted file mode 100644 index 6c8c3f52..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 deleted file mode 100644 index afe8d4ef..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 deleted file mode 100644 index 674c4281..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 deleted file mode 100644 index 0dbec85e..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css deleted file mode 100644 index d7a65374..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css +++ /dev/null @@ -1,60 +0,0 @@ -/* -The TeX Gyre Termes fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Regular'), - url('texgyretermes-regular.woff2'), url('texgyretermes-regular.woff'); -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Bold'), - url('texgyretermes-bold.woff2'), url('texgyretermes-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Italic'), - url('texgyretermes-italic.woff2'), url('texgyretermes-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-BoldItalic'), - url('texgyretermes-bolditalic.woff2'), url('texgyretermes-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes Math; - src: local('TeX Gyre Termes Math'), local('TeXGyreTermesMath-Regular'), - url('texgyretermes-math.woff2'), url('texgyretermes-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Termes; -} -m|math { - font-family: TeX Gyre Termes Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 deleted file mode 100644 index a346eb13..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 deleted file mode 100644 index 571a2f07..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 deleted file mode 100644 index 401cd0ec..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 deleted file mode 100644 index 31c9adc2..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 deleted file mode 100644 index 1a15f9ad..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 deleted file mode 100644 index 7a12dd34..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 deleted file mode 100644 index c4daad18..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 deleted file mode 100644 index 9d434203..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 deleted file mode 100644 index 9acf905c..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 deleted file mode 100644 index c93f7230..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 deleted file mode 100644 index fa9345cb..00000000 Binary files a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css b/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css deleted file mode 100644 index 9b62b7c3..00000000 --- a/io.sc.engine.st.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -XITS is released under the SIL Open Font License. See the files in this -directory for details. The font can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://mirrors.ctan.org/fonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: XITS; - src: local('XITS'), - url('XITS-Regular.woff2'), url('XITS-Regular.woff'); -} -@font-face { - font-family: XITS; - src: local('XITS Bold'), local('XITS-Bold'), - url('XITS-Bold.woff2'), url('XITS-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: XITS; - src: local('XITS Italic'), local('XITS-Italic'), - url('XITS-Italic.woff2'), url('XITS-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: XITS; - src: local('XITS Bold Italic'), local('XITS-BoldItalic'), - url('XITS-BoldItalic.woff2'), url('XITS-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: XITS Math; - src: local('XITS Math'), local('XITSMath-Regular'), - url('XITSMath-Regular.woff2'), url('XITSMath-Regular.woff'); -} -@font-face { - font-family: XITS Math; - src: local('XITS Math Bold'), local('XITSMath-Bold'), - url('XITSMath-Bold.woff2'), url('XITSMathBold.woff'); - font-weight: bold; -} - -.htmlmathparagraph, m|mtext { - font-family: XITS; -} -m|math { - font-family: XITS Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values XITS Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.platform.app/build.gradle b/io.sc.platform.app/build.gradle index ff8838f6..0f587e4a 100644 --- a/io.sc.platform.app/build.gradle +++ b/io.sc.platform.app/build.gradle @@ -10,9 +10,16 @@ dependencies { project(":io.sc.platform.lcdp"), project(":io.sc.platform.orm.mybatis"), project(":io.sc.platform.poi"), + project(":io.sc.platform.security.loginform"), project(":io.sc.platform.system"), project(":io.sc.platform.ws.cxf"), - project(":org.webjars.luckysheet-2.1.13"), - project(":org.webjars.tailwindcss-3.3.5"), + + "org.webjars:org.webjars.codemirror:5.37.0", + "org.webjars:org.webjars.jquery:1.12.4", + "org.webjars:org.webjars.luckysheet:2.1.13", + "org.webjars:org.webjars.mathcss:1.0.0", + "org.webjars:org.webjars.mathfonts:1.0.0", + "org.webjars:org.webjars.mxgraph:3.9.12", + "org.webjars:org.webjars.tailwindcss:3.3.5", ) } diff --git a/io.sc.platform.core.frontend/.bin/sync.js b/io.sc.platform.core.frontend/.bin/sync.js index 5399a62e..fb53e7b6 100644 --- a/io.sc.platform.core.frontend/.bin/sync.js +++ b/io.sc.platform.core.frontend/.bin/sync.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); * 同步 platform-core 定义的前端项目配置 * 从 platform-core 库的 template-project 目录中复制前端项目文件到本地项目 */ -const {cp, mergeJsonFile } =require('./util.js'); +const { rm, cp, mergeJsonFile } =require('./util.js'); const sync = async () => { const sourceDir =process.cwd() + '/node_modules/platform-core/template-project/'; @@ -31,6 +31,8 @@ const sync = async () => { cp(sourceDir + 'webpack.env.build.cjs', targetDir + 'webpack.env.build.cjs'); cp(sourceDir + 'webpack.env.prod.cjs', targetDir + 'webpack.env.prod.cjs'); cp(sourceDir + 'webpack.env.serve.cjs', targetDir + 'webpack.env.serve.cjs'); + + rm(targetDir + 'public'); cp(sourceDir + 'public', targetDir + 'public'); mergeJsonFile(targetDir + 'frontend-register.json', sourceDir + 'frontend-register.json', ['path']); diff --git a/io.sc.platform.core.frontend/package.json b/io.sc.platform.core.frontend/package.json index 4af9c49c..0b994174 100644 --- a/io.sc.platform.core.frontend/package.json +++ b/io.sc.platform.core.frontend/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.1.288", + "version": "8.1.295", "description": "前端核心包,用于快速构建前端的脚手架", "//main": "库的主文件", "main": "dist/platform-core.js", diff --git a/io.sc.platform.core.frontend/public/configure.js b/io.sc.platform.core.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.platform.core.frontend/public/configure.js +++ b/io.sc.platform.core.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages.json b/io.sc.platform.core.frontend/src/platform/i18n/messages.json index 1cd223b1..f544b242 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages.json @@ -35,6 +35,7 @@ "reset": "Reset", "rownum": "Row Number", "search": "Search", + "security.login.dialog.title": "Session expired, Please login again", "security.login.message.error": "authentication failed! please check your user name and password.", "security.login.password.placeholder": "Please input password", "security.login.title": "System Authentication", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json index 8e75e97f..cc7048b4 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json @@ -35,6 +35,7 @@ "reset": "重置", "rownum": "序號", "search": "搜索", + "security.login.dialog.title": "會話已過期, 請重新登錄", "security.login.message.error": "認證失敗!請檢查您輸入的登陸名和密碼是否正確", "security.login.password.placeholder": "請輸入密碼", "security.login.title": "系統登錄", diff --git a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json index 94452f26..8d4025bf 100644 --- a/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json +++ b/io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json @@ -35,6 +35,7 @@ "reset": "重置", "rownum": "序号", "search": "搜索", + "security.login.dialog.title": "会话已过期, 请重新登录", "security.login.message.error": "认证失败! 请检查您输入的登录名和密码是否正确。", "security.login.password.placeholder": "请输入密码", "security.login.title": "系统登录", diff --git a/io.sc.platform.core.frontend/src/platform/index.ts b/io.sc.platform.core.frontend/src/platform/index.ts index fc178516..47e299b0 100644 --- a/io.sc.platform.core.frontend/src/platform/index.ts +++ b/io.sc.platform.core.frontend/src/platform/index.ts @@ -86,7 +86,7 @@ export { I18nMessageManager } from './plugin'; export { MenuManager } from './plugin'; export { MockManager } from './plugin'; export { NotifyManager } from './plugin'; -export { Oauth2Manager } from './plugin'; +export { AuthenticationManager } from './plugin'; export { RouterManager } from './plugin'; export { SessionManager } from './plugin'; export { TagViewManager } from './plugin'; diff --git a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue index cf201749..57690666 100644 --- a/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue +++ b/io.sc.platform.core.frontend/src/platform/layout/sub-layout/Topper.vue @@ -21,7 +21,7 @@
- {{ t('application.title') }} + {{ $t('application.title') }}
@@ -151,9 +151,12 @@ + + @@ -164,13 +167,15 @@ import { ref } from 'vue'; import { useQuasar } from 'quasar'; import { useI18n } from 'vue-i18n'; -import { axios, Environment, SessionManager, I18nMessageManager, Oauth2Manager } from '@/platform'; +import { Environment, SessionManager, I18nMessageManager, AuthenticationManager } from '@/platform'; +import LoginDialog from '@/platform/views/LoginDialog'; import AboutDialog from './AboutDialog.vue'; import ChangePasswordDialog from './ChangePasswordDialog.vue'; const gc = Environment.getConfigure(); const quasar = useQuasar(); const searchContent = ref(''); +const loginDialog = ref(); const aboutDialog = ref(); const changePasswordDialog = ref(); const { t } = useI18n(); @@ -189,6 +194,18 @@ const fullScreen = () => { } }; +const about = () => { + aboutDialog.value.open(); +}; + +const changePassword = () => { + changePasswordDialog.value.open(); +}; + +const openLoginDialog = () => { + loginDialog.value.open(); +}; + const logout = () => { if (gc.theme.login.logoutConfirm) { quasar @@ -219,21 +236,12 @@ const logout = () => { }; const doLogout = () => { - logoutForm.value.$el.submit(); - Oauth2Manager.revokeTokens(() => { - window.location.href = Environment.getWebContextPath(); - }); -}; - -const about = () => { - aboutDialog.value.open(); -}; - -const changePassword = () => { - changePasswordDialog.value.open(); + AuthenticationManager.removeLocalAccessToken(); + window.location.href = Environment.getWebContextPath(); }; Environment.registAction('about', about); Environment.registAction('changePassword', changePassword); +Environment.registAction('openLoginDialog', openLoginDialog); Environment.registAction('logout', logout); diff --git a/io.sc.platform.core.frontend/src/platform/plugin/axios copy.ts b/io.sc.platform.core.frontend/src/platform/plugin/axios copy.ts new file mode 100644 index 00000000..809f3c83 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/plugin/axios copy.ts @@ -0,0 +1,164 @@ +import type { App } from 'vue'; +import Axios from 'axios'; +import { i18n } from './i18n'; +import { PConst } from '@/platform/PConst'; +import { Environment } from '@/platform/plugin/environment'; +import { NotifyManager, Oauth2Manager } from './manager'; +import { QuasarTools } from '@/platform/utils'; + +const ignoredUrls: string[] = [PConst.API_I18N_MESSAGES_URL, PConst.API_APP_CONFIGURE_URL]; +const gc = Environment.getConfigure(); + +// 请求拦截器 +const requestInterceptor = (config: any) => { + config.headers.locale = gc.setting.i18n.locale; + // 忽略无需认证的请求 URL + for (const url of ignoredUrls) { + if (config.url.includes(url)) { + return config; + } + } + const result = config; + result.headers.Authorization = 'Bearer ' + Oauth2Manager.getLocalAccessToken(); + /* + // 对于需要认证的请求 URL 添加 basic 认证 + const result = config; + if (gc.axios?.basicAuth?.enable) { + result.headers.Authorization = 'Basic ' + window.btoa(gc.axios.basicAuth.username + ':' + gc.axios.basicAuth.password); + } + */ + // 如果请求时传入 { loading: true } 属性, 则自动显示 "正在处理..., 请等待" 模态对话框 + if (config?.loading) { + QuasarTools.getQuasar()?.loading?.show({ + message: i18n.global.t('loading'), + boxClass: 'bg-grey-2 text-grey-9', + spinnerColor: 'primary', + }); + } + return result; +}; + +// 请求错误拦截器 +const requestErrorInterceptor = (error: any) => { + return Promise.reject(error); +}; + +// 响应拦截器 +const responseInterceptor = (response: any) => { + // 请求成功, 进入该方法说明 response 的状态码为 2xx + QuasarTools.getQuasar()?.loading?.hide(); + return response.data; +}; + +// 响应错误拦截器 +const responseErrorInterceptor = (error: any) => { + QuasarTools.getQuasar()?.loading?.hide(); + // 请求失败, 进入该方法说明 response 的状态码不为 2xx + if (error.code === 'ECONNABORTED' || error.message.indexOf('timeout') !== -1 || error.message === 'Network Error') { + // 发生网络错误 + const $t = i18n.global.t; + NotifyManager.error($t('NetworkError')); + return Promise.reject({ + code: 'NetworkError', + errorMessageI18nKey: 'NetworkError', + errorMessage: error.message, + exception: 'NetworkError', + stackTrace: error.stack, + data: null, + }); + } else { + // 服务器端错误 + const response = error?.response; + const status = response?.status; + const data = response?.data; + if (status === 401) { + if (Oauth2Manager.isAuthorizationCodeRedirectUri()) { + return Promise.resolve({}); + } else { + if (gc.oauth2) { + let url = '/oauth2/authorize?'; + url += 'client_id=' + gc.oauth2.clientId; + url += '&client_secret=' + gc.oauth2.clientSecret; + url += '&response_type=code'; + url += '&redirect_uri=' + encodeURIComponent(gc.oauth2.redirectUri); + window.location.href = Environment.apiContextPath(url); + } + } + return; + } + //下载错误 + if (error.request.responseType === 'blob') { + NotifyManager.error(i18n.global.t(error?.code)); + return Promise.reject(error); + } + //其他错误 + if (status === 500) { + NotifyManager.error(i18n.global.t(data?.errorMessageI18nKey)); + return Promise.reject(response.data); + } else { + NotifyManager.error(i18n.global.t(status)); + return Promise.reject({ + code: status, + errorMessageI18nKey: status, + errorMessage: error.message, + exception: error.code, + stackTrace: error.stack, + data: null, + }); + } + } +}; + +// 普通 axios +const axios = Axios.create({ + baseURL: gc.axios?.baseURL || '', + timeout: gc.axios?.timeout || 1000 * 60, +}); +axios.interceptors.request.use(requestInterceptor, requestErrorInterceptor); +axios.interceptors.response.use(responseInterceptor, responseErrorInterceptor); + +// 无默认服务器端错误处理的 axios +const noErrorAxios = Axios.create({ + baseURL: gc.axios?.baseURL || '', + timeout: gc.axios?.timeout || 1000 * 60, +}); +noErrorAxios.interceptors.request.use(requestInterceptor, requestErrorInterceptor); +noErrorAxios.interceptors.response.use(responseInterceptor, (error: any) => { + QuasarTools.getQuasar()?.loading?.hide(); + // 请求失败, 进入该方法说明 response 的状态码不为 2xx + if (error.code === 'ECONNABORTED' || error.message.indexOf('timeout') !== -1 || error.message === 'Network Error') { + // 发生网络错误 + const $t = i18n.global.t; + NotifyManager.error($t('NetworkError')); + return Promise.reject({ + code: 'NetworkError', + errorMessageI18nKey: 'NetworkError', + errorMessage: error.message, + exception: 'NetworkError', + stackTrace: error.stack, + data: null, + }); + } else { + return Promise.reject(error); + } +}); + +// 下载二进制 axios +const blobAxios = Axios.create({ + baseURL: gc.axios?.baseURL || '', + timeout: gc.axios?.timeout || 1000 * 60, +}); +blobAxios.interceptors.request.use(requestInterceptor, requestErrorInterceptor); +blobAxios.interceptors.response.use((response: any) => { + QuasarTools.getQuasar()?.loading?.hide(); + return response; +}, responseErrorInterceptor); + +export default { + install: (app: App) => { + app.config.globalProperties.$axios = axios; + app.config.globalProperties.$blobAxios = blobAxios; + }, +}; + +export { axios, blobAxios, noErrorAxios }; diff --git a/io.sc.platform.core.frontend/src/platform/plugin/axios.ts b/io.sc.platform.core.frontend/src/platform/plugin/axios.ts index 809f3c83..6d2a808f 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/axios.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/axios.ts @@ -3,7 +3,7 @@ import Axios from 'axios'; import { i18n } from './i18n'; import { PConst } from '@/platform/PConst'; import { Environment } from '@/platform/plugin/environment'; -import { NotifyManager, Oauth2Manager } from './manager'; +import { NotifyManager, AuthenticationManager } from './manager'; import { QuasarTools } from '@/platform/utils'; const ignoredUrls: string[] = [PConst.API_I18N_MESSAGES_URL, PConst.API_APP_CONFIGURE_URL]; @@ -19,7 +19,10 @@ const requestInterceptor = (config: any) => { } } const result = config; - result.headers.Authorization = 'Bearer ' + Oauth2Manager.getLocalAccessToken(); + if (AuthenticationManager.getLocalAccessToken()) { + result.headers.Authorization = 'Bearer ' + AuthenticationManager.getLocalAccessToken(); + } + /* // 对于需要认证的请求 URL 添加 basic 认证 const result = config; @@ -72,19 +75,12 @@ const responseErrorInterceptor = (error: any) => { const status = response?.status; const data = response?.data; if (status === 401) { - if (Oauth2Manager.isAuthorizationCodeRedirectUri()) { - return Promise.resolve({}); + if (error.request.responseURL.endsWith('/api/system/user/session')) { + return Promise.resolve(null); } else { - if (gc.oauth2) { - let url = '/oauth2/authorize?'; - url += 'client_id=' + gc.oauth2.clientId; - url += '&client_secret=' + gc.oauth2.clientSecret; - url += '&response_type=code'; - url += '&redirect_uri=' + encodeURIComponent(gc.oauth2.redirectUri); - window.location.href = Environment.apiContextPath(url); - } + Environment.executeAction('openLoginDialog'); + return Promise.reject(error); } - return; } //下载错误 if (error.request.responseType === 'blob') { diff --git a/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json b/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json index 1bd539df..d1744e95 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json +++ b/io.sc.platform.core.frontend/src/platform/plugin/environment/default-configure.json @@ -5,7 +5,6 @@ "redirectUri" : "http://localhost:3000" }, "setting" : { - "routerHistoryMode" : "hash", "homePage" : "/home", "i18n" : { "availableLocales" : [ "en", "zh_CN", "tw_CN" ], diff --git a/io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts b/io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts index efbac410..3d05f41a 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts @@ -69,6 +69,14 @@ class Environment { */ static #layoutProviderMap = new Map(); + /** + * 获取 router 历史模式 + * @returns router 历史模式 + */ + public static getRouterHistoryMode() { + return window[PConst.APP][PConst.CONFIGURE].routerHistoryMode; + } + /** * 获取模块名称 * @returns 模块名称 diff --git a/io.sc.platform.core.frontend/src/platform/plugin/index.ts b/io.sc.platform.core.frontend/src/platform/plugin/index.ts index 41217079..11426f84 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/index.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/index.ts @@ -30,7 +30,7 @@ export { I18nMessageManager } from './manager'; export { MenuManager } from './manager'; export { MockManager } from './manager'; export { NotifyManager } from './manager'; -export { Oauth2Manager } from './manager'; +export { AuthenticationManager } from './manager'; export { RouterManager } from './manager'; export { SessionManager } from './manager'; export { TagViewManager } from './manager'; diff --git a/io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts b/io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts index 91de4e74..81d22063 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts @@ -9,10 +9,10 @@ import { SessionManager, I18nMessageManager, NotifyManager, - Oauth2Manager, MenuManager, RouterManager, } from '@/platform/plugin/manager'; +import { router } from '@/platform/plugin'; import { Tools, JavascriptLoader } from '@/platform/utils'; const gc = Environment.getConfigure(); @@ -21,10 +21,13 @@ const gc = Environment.getConfigure(); * 应用初始化类 */ class ApplicationInitializer { + static #initializeParameter: any; + /** * 初始化应用 */ public static async initialize(parameter: AppInitializeParameterType) { + ApplicationInitializer.#initializeParameter = parameter; Environment.setModuleName(parameter?.moduleName || ''); Environment.setModuleVersion(parameter?.moduleName || ''); @@ -40,12 +43,14 @@ class ApplicationInitializer { await I18nMessageManager.changeLanguage(gc.setting.i18n.locale as I18nMessageLocaleType, false); // Oauth2 鉴权 - if (Oauth2Manager.isAuthorizationCodeRedirectUri()) { - Oauth2Manager.loadTokens(() => { - window.location.href = Environment.getWebContextPath(); - }); - return; - } + // if (Oauth2Manager.isAuthorizationCodeRedirectUri()) { + // Oauth2Manager.loadTokens(() => { + // window.location.href = Environment.getWebContextPath(); + // }); + // return; + // } + + RouterManager.buildRoutes(); // 获取用户会话 const userSession = await SessionManager.loadUserSession(); @@ -77,9 +82,20 @@ class ApplicationInitializer { } else { parameter.callback(); } + } else { + parameter.callback(); + router.push({ name: 'login' }); } } + /** + * 获取初始化时传入的参数 + * @returns 初始化时传入的参数 + */ + public static getInitializeParameter() { + return ApplicationInitializer.#initializeParameter; + } + /** * 初始化完毕后的回调函数 */ diff --git a/io.sc.platform.core.frontend/src/platform/plugin/manager/AuthenticationManager.ts b/io.sc.platform.core.frontend/src/platform/plugin/manager/AuthenticationManager.ts new file mode 100644 index 00000000..01ac59c5 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/plugin/manager/AuthenticationManager.ts @@ -0,0 +1,57 @@ +import { SessionManager } from '@/platform'; + +class AuthenticationManager { + public static async isAuthenticated() { + const userSession = await SessionManager.loadUserSession(); + if (userSession) { + return true; + } + return false; + } + + /** + * 获取本地访问令牌 + */ + public static getLocalAccessToken() { + return localStorage.getItem('access_token'); + } + + /** + * 设置本地访问令牌 + * @param accessToken 访问令牌 + */ + public static setLocalAccessToken(accessToken) { + localStorage.setItem('access_token', accessToken); + } + + /** + * + */ + public static getLocalRefreshToken() { + return localStorage.getItem('refresh_token'); + } + + /** + * 设置本地刷新令牌 + * @param refreshToken 刷新令牌 + */ + public static setLocalRefreshToken(refreshToken) { + localStorage.setItem('refresh_token', refreshToken); + } + + /** + * 移除本地访问令牌 + */ + public static removeLocalAccessToken() { + localStorage.removeItem('access_token'); + } + + /** + * 移除本地刷新令牌 + */ + public static removeLocalRefreshToken() { + localStorage.removeItem('refresh_token'); + } +} + +export { AuthenticationManager }; diff --git a/io.sc.platform.core.frontend/src/platform/plugin/manager/RouterManager.ts b/io.sc.platform.core.frontend/src/platform/plugin/manager/RouterManager.ts index a17cc232..b45ab4e2 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/manager/RouterManager.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/manager/RouterManager.ts @@ -55,8 +55,10 @@ class RouterManager { } //将所有本地路由的模块设置成项目模块名 - for (const route of RouterManager.#localRoutes) { - route.module = Environment.getModuleName(); + if (RouterManager.#localRoutes) { + for (const route of RouterManager.#localRoutes) { + route.module = Environment.getModuleName(); + } } // 移除所有路由 diff --git a/io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts b/io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts index e16505c9..93c544c7 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/manager/SessionManager.ts @@ -77,7 +77,9 @@ class SessionManager { const response = await axios.get(Environment.apiContextPath(PConst.API_USER_SESSION_URL)); if (response) { console.debug('User session was loaded', response.data); - return response.data; + return Promise.resolve(response.data); + } else { + return Promise.resolve(null); } } diff --git a/io.sc.platform.core.frontend/src/platform/plugin/manager/TagViewManager.ts b/io.sc.platform.core.frontend/src/platform/plugin/manager/TagViewManager.ts index 6f2ae356..ad942d25 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/manager/TagViewManager.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/manager/TagViewManager.ts @@ -14,6 +14,7 @@ const gr = Environment.getGlobalReactive(); * TagView 管理器类 */ class TagViewManager { + static #updated = false; static #DEFAULT_JSON = '{"version":"-1","tagVeiws":[],"breadcrumbs":[]}'; static #tagViewsAndBreadcrumbs = reactive({ version: '' + Environment.getPlatformCoreVersion(), @@ -34,11 +35,17 @@ class TagViewManager { * @param to 前端路由 */ public static handleTagViewAndBreadcrumbsAndKeepAlive(to: any) { + if (to.name === 'login') { + return; + } if (to.name) { const menu = MenuManager.getMenuByRoute(to); const isHomePageRoute = to.fullPath === gc.setting.homePage; const storage = JSON.parse(SessionStorage.getItem(PConst.APP) || TagViewManager.#DEFAULT_JSON); + // 更新 tagview, 避免更换用户登录后,由于权限的不同,某些 tag 无法打开的问题 + TagViewManager.update(storage); + TagViewManager.#tagViewsAndBreadcrumbs.tagViews = TagViewManager.createTagViews(storage); TagViewManager.#tagViewsAndBreadcrumbs.breadcrumbs = TagViewManager.createBreadcrumbs(storage); @@ -99,6 +106,22 @@ class TagViewManager { } } + private static update(storage: any) { + if (!TagViewManager.#updated) { + const tagViews = []; + if (storage.tagViews && storage.tagViews.length > 0) { + for (const tagView of storage.tagViews) { + if (RouterManager.getRouteByName(tagView.routeName)) { + tagViews.push(tagView); + } + } + } + storage.tagViews = tagViews; + TagViewManager.#tagViewsAndBreadcrumbs.tagViews = tagViews; + TagViewManager.#updated = true; + } + } + private static createTagViews(storage: any): TagViewType[] { if (TagViewManager.#tagViewsAndBreadcrumbs.version !== storage.version) { return new Array(); diff --git a/io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts b/io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts index 2f3695f1..8e58bb9d 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts @@ -6,7 +6,7 @@ export { I18nMessageManager } from './I18nMessageManager'; export { MenuManager } from './MenuManager'; export { MockManager } from './MockManager'; export { NotifyManager } from './NotifyManager'; -export { Oauth2Manager } from './Oauth2Manager'; +export { AuthenticationManager } from './AuthenticationManager'; export { RouterManager } from './RouterManager'; export { SessionManager } from './SessionManager'; export { TagViewManager } from './TagViewManager'; diff --git a/io.sc.platform.core.frontend/src/platform/plugin/router.ts b/io.sc.platform.core.frontend/src/platform/plugin/router.ts index 84256598..95c51318 100644 --- a/io.sc.platform.core.frontend/src/platform/plugin/router.ts +++ b/io.sc.platform.core.frontend/src/platform/plugin/router.ts @@ -2,7 +2,7 @@ import type { App } from 'vue'; import { createRouter, createWebHistory, createWebHashHistory, RouteRecordRaw } from 'vue-router'; import { LoadingBar } from 'quasar'; import { Environment } from './environment'; -import { TagViewManager } from './manager'; +import { AuthenticationManager, TagViewManager } from './manager'; import WBasicLayout from '@/platform/layout/WBasicLayout.vue'; import Login from '@/platform/views/Login.vue'; import Home from '@/platform/views/Home.vue'; @@ -56,15 +56,33 @@ const PLATFORM_ROUTES = [ ]; const router = createRouter({ - history: gc.setting?.routerHistoryMode === 'web' ? createWebHistory(webContextPath) : createWebHashHistory(), + history: gc.routerHistoryMode === 'web' ? createWebHistory(webContextPath) : createWebHashHistory(), routes: PLATFORM_ROUTES as RouteRecordRaw[], }); -router.beforeEach((to: any, from: any, next: any) => { - // 显示进度条 - LoadingBar.start(); - TagViewManager.handleTagViewAndBreadcrumbsAndKeepAlive(to); - next(); +router.beforeEach(async (to: any, from: any, next: any) => { + if (to.name === 'login') { + // 是否已经认证 + const isAuthenticated = await AuthenticationManager.isAuthenticated(); + if (isAuthenticated) { + // 如果已经认证了, 直接跳转到首页 + next({ name: '/' }); + } else { + // 否则进入登录页面 + next(); + } + } else { + if (AuthenticationManager.getLocalAccessToken()) { + //已登录 + // 显示进度条 + LoadingBar.start(); + TagViewManager.handleTagViewAndBreadcrumbsAndKeepAlive(to); + next(); + } else { + //导航到登录页面 + next({ name: 'login' }); + } + } }); router.afterEach((to?: any, from?: any) => { diff --git a/io.sc.platform.core.frontend/src/platform/views/Login.vue b/io.sc.platform.core.frontend/src/platform/views/Login.vue index 716291e9..3c459b9a 100644 --- a/io.sc.platform.core.frontend/src/platform/views/Login.vue +++ b/io.sc.platform.core.frontend/src/platform/views/Login.vue @@ -11,29 +11,43 @@ }" > - + - + - {{ $t('application.title') }} +
+ {{ $t('application.title') }} +
+ + + -
- +
+
{{ $t('language') }}
- + {{ $t('language.' + lang) }} @@ -49,13 +63,14 @@
-
-
- - +
+
+
+ + - + @@ -65,16 +80,21 @@ - -
- - {{ $t('security.login.message.error') }} + +
+
+ +
+
+ {{ $t('security.login.message.error') }} +
- + - diff --git a/io.sc.platform.core.frontend/src/platform/views/LoginDialog.vue b/io.sc.platform.core.frontend/src/platform/views/LoginDialog.vue new file mode 100644 index 00000000..852d73c9 --- /dev/null +++ b/io.sc.platform.core.frontend/src/platform/views/LoginDialog.vue @@ -0,0 +1,170 @@ + + diff --git a/io.sc.platform.core.frontend/template-project/package.json b/io.sc.platform.core.frontend/template-project/package.json index 6ba97533..4ed05fa9 100644 --- a/io.sc.platform.core.frontend/template-project/package.json +++ b/io.sc.platform.core.frontend/template-project/package.json @@ -1,6 +1,6 @@ { "name": "platform-core", - "version": "8.1.288", + "version": "8.1.295", "description": "前端核心包,用于快速构建前端的脚手架", "private": false, "keywords": [], @@ -104,7 +104,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.288", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/io.sc.platform.core.frontend/template-project/public/configure.js b/io.sc.platform.core.frontend/template-project/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.platform.core.frontend/template-project/public/configure.js +++ b/io.sc.platform.core.frontend/template-project/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue index c9d77fe2..2ad76783 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/likm/Grid.vue @@ -109,18 +109,41 @@ :data-url="Environment.apiContextPath('/api/system/application')" :sort-by="['order']" :query-form-cols-num="3" + db-click-operation="rowEdit" :query-form-fields="[ { name: 'code', label: $t('code'), type: 'text' }, { name: 'name', label: $t('name'), type: 'text' }, { name: 'enable', label: $t('isEnable'), type: 'select', options: Options.yesNo() }, ]" :toolbar-configure="{ noIcon: false }" - :toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'separator', 'export']" + :toolbar-actions="[ + 'query', + 'refresh', + 'separator', + 'rowEdit', + 'rowsEdit', + 'separator', + 'add', + 'clone', + 'edit', + 'remove', + 'separator', + 'view', + 'separator', + 'export', + ]" :columns="[ - { width: 60, name: 'order', label: $t('order') }, - { width: 100, name: 'code', label: $t('code') }, - { width: '100%', name: 'name', label: $t('name') }, - { width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag() }, + { name: 'order', label: $t('order'), type: 'number', attrs: { required: true } }, + { name: 'code', label: $t('code'), type: 'text', attrs: { required: true } }, + { + name: 'name', + label: $t('name'), + type: 'text', + format: (val, row) => { + return val; + }, + }, + { width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag(), type: 'checkbox' }, { width: 120, name: 'lastModifier', label: $t('lastModifier') }, { width: 120, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() }, ]" @@ -159,12 +182,21 @@ ], }, }" - @row-click="(evt, row, index) => {}" + @row-click=" + (evt, row, index) => { + // console.info('rowclick'); + } + " @before-request-data="() => {}" @after-row-draggable=" (grid, updateDatas) => { - console.info('grid=====', grid); - console.info('updateDatas======', updateDatas); + // console.info('grid=====', grid); + // console.info('updateDatas======', updateDatas); + } + " + @after-editor-open=" + () => { + console.info('打开窗口'); } " > @@ -178,6 +210,12 @@ import { axios, Environment, EnumTools, Options, Formater } from '@/platform'; import EnableIcon from '@/platform/components/grid/EnableIcon.vue'; import { IconEnum } from '@/platform/enums'; +// :query-criteria="{ +// operator: 'equals', +// fieldName: 'code', +// value: 'A', +// }" + const dialogRef = ref(); const gridRef = ref(); const grid2 = ref(); diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/GridForamt.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/GridForamt.vue new file mode 100644 index 00000000..597ecf39 --- /dev/null +++ b/io.sc.platform.core.frontend/template-project/src/views/likm/GridForamt.vue @@ -0,0 +1,18 @@ + + + diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/QuasarGrid.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/QuasarGrid.vue index b0c6f538..16d8855d 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/likm/QuasarGrid.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/likm/QuasarGrid.vue @@ -1,752 +1,69 @@ - - + diff --git a/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue b/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue index a62c42e7..51263db6 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/likm/TreeGrid.vue @@ -8,6 +8,7 @@ tree :tree-icon="(row) => {}" :checkbox-selection="true" + db-click-operation="rowEdit" :data-url="testGrid.dataUrl" :fetch-data-url="testGrid.fetchDataUrl" :columns="testGrid.tableColumns" @@ -59,29 +60,9 @@ const testGrid = { 'reset', 'refresh', 'separator', - { - name: 'custBtn', - extend: 'add', - icon: undefined, - label: '自定义按钮', - enableIf: (selected, grid) => { - if (selected && selected.length > 0) { - return true; - } - return false; - }, - // beforeClick: (selected, context, grid) => { - // console.info('先执行before'); - // context.aaa = '111'; - // }, - click: (selected, context, _click, grid) => { - _click(selected); - }, - afterClick: (selected, context, grid) => { - console.info('=grid==', grid.getEditorForm()); - // gridRefs.addEditFormRef.setFieldValue('userName', '李四'); - }, - }, + 'rowEdit', + 'rowsEdit', + 'separator', 'addTop', 'addChild', 'expand', @@ -111,6 +92,7 @@ const testGrid = { name: 'name', label: '菜单名称', // width: 500, + type: 'text', format: (val, row) => { return t(row.name); }, @@ -118,6 +100,10 @@ const testGrid = { { name: 'icon', label: '图标', + type: 'icon', + attrs: { + required: true, + }, format: (val, row) => { return { componentType: 'q-icon', diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/math/MathEditorForm.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/math/MathEditorForm.vue new file mode 100644 index 00000000..94ac5dba --- /dev/null +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/math/MathEditorForm.vue @@ -0,0 +1,178 @@ + + diff --git a/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue b/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue index 28f6574f..a9a2498a 100644 --- a/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue +++ b/io.sc.platform.core.frontend/template-project/src/views/testcase/maxgraph/Maxgraph.vue @@ -5,6 +5,7 @@ import { onMounted, vue } from 'vue'; import { type CellStyle, Graph, InternalEvent } from '@maxgraph/core'; +/* onMounted(() => { const container = document.getElementById('graph-container'); // Disables the built-in context menu @@ -48,4 +49,5 @@ onMounted(() => { }); }); }); +*/ diff --git a/io.sc.platform.core/build.gradle b/io.sc.platform.core/build.gradle index 4152e877..c4f0c6cd 100644 --- a/io.sc.platform.core/build.gradle +++ b/io.sc.platform.core/build.gradle @@ -13,6 +13,7 @@ dependencies { "jakarta.servlet:jakarta.servlet-api", "org.apache.commons:commons-lang3", "org.apache.commons:commons-text:${commons_text_version}", + "com.google.guava:guava:${guava_version}", "com.beust:jcommander:${jcommander_version}", "net.lingala.zip4j:zip4j:${zip4j_version}", diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/springboot/AfterEnvironmentProcessor.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/springboot/AfterEnvironmentProcessor.java index 67ba68c2..20f6c593 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/springboot/AfterEnvironmentProcessor.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/springboot/AfterEnvironmentProcessor.java @@ -3,7 +3,7 @@ package io.sc.platform.core.springboot; import io.sc.platform.core.Environment; import io.sc.platform.core.plugins.PluginManager; import io.sc.platform.core.plugins.item.ExportableResource; -import org.apache.tomcat.util.http.fileupload.IOUtils; +import io.sc.platform.core.util.FileUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.core.Ordered; @@ -76,7 +76,7 @@ public class AfterEnvironmentProcessor implements EnvironmentPostProcessor, Orde if(StringUtils.hasText(selectedSource)){ Resource source =resourceLoader.getResource(selectedSource); if(source!=null && source.exists()){ - IOUtils.copy(source.getInputStream(), new FileOutputStream(target)); + FileUtil.copyFile(source.getInputStream(), new FileOutputStream(target)); } } } diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/RSAUtil.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/RSAUtil.java index 42d1ab63..a1bb0241 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/RSAUtil.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/RSAUtil.java @@ -55,11 +55,11 @@ public class RSAUtil { public static KeyPair loadFromLocation(String publicKeyLocation,String privateKeyLocation) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException { Assert.notNull(publicKeyLocation,"publicKeyLocation cannot be null"); Assert.notNull(privateKeyLocation,"privateKeyLocation cannot be null"); - Resource publicKeyResource = new DefaultResourceLoader().getResource(publicKeyLocation); + Resource publicKeyResource = ResourceUtil.getResource(publicKeyLocation); if(!publicKeyResource.exists()){ throw new IllegalArgumentException("public key resource: [" + publicKeyLocation + "] NOT exists"); } - Resource privateKeyResource = new DefaultResourceLoader().getResource(privateKeyLocation); + Resource privateKeyResource = ResourceUtil.getResource(privateKeyLocation); if(!privateKeyResource.exists()){ throw new IllegalArgumentException("private key resource: [" + privateKeyResource + "] NOT exists"); } diff --git a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ResourceUtil.java b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ResourceUtil.java index 7e7db347..8e4378c6 100644 --- a/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ResourceUtil.java +++ b/io.sc.platform.core/src/main/java/io/sc/platform/core/util/ResourceUtil.java @@ -2,6 +2,7 @@ package io.sc.platform.core.util; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; +import org.springframework.util.StringUtils; /** * 资源辅助工具类 @@ -9,6 +10,8 @@ import org.springframework.core.io.Resource; * */ public class ResourceUtil { + private static final String PREFIX_FILE ="file://"; + private ResourceUtil(){} /** * 获取资源 @@ -16,6 +19,26 @@ public class ResourceUtil { * @return 资源 */ public static Resource getResource(String location) { - return new DefaultResourceLoader().getResource(location); + return new DefaultResourceLoader().getResource(standardized(location)); + } + + /** + * 标准化资源 URL + * @param location 资源位置 URL + * @return 标准化资源 URL + */ + public static String standardized(String location){ + if(StringUtils.hasText(location)){ + // 对于 file:// 前缀的 URL, 后面的路径必须以 / 开头 + // file://D:/path/to/target 无法正常加载 + // file:///D:/path/to/target 正常加载 + if(location.startsWith(PREFIX_FILE)){ + String path =location.substring(PREFIX_FILE.length()); + if(!path.startsWith("/")){ + return PREFIX_FILE + "/" + path; + } + } + } + return location; } } diff --git a/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/directories.json b/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/directories.json index 46f7d355..abcff5c0 100644 --- a/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/directories.json +++ b/io.sc.platform.core/src/main/resources/META-INF/platform/plugins/directories.json @@ -1,7 +1,7 @@ [ {"name":"dir.config" ,"path":"/config" ,"autoCreate":true}, {"name":"dir.config.https" ,"path":"/config/https" ,"autoCreate":true}, - {"name":"dir.config.oauth2" ,"path":"/config/oauth2" ,"autoCreate":true}, + {"name":"dir.config.jwt" ,"path":"/config/jwt" ,"autoCreate":true}, {"name":"dir.log" ,"path":"/logs" ,"autoCreate":true}, {"name":"dir.work" ,"path":"/work" ,"autoCreate":true} ] diff --git a/io.sc.platform.developer.frontend/package.json b/io.sc.platform.developer.frontend/package.json index acb51422..7432f9bf 100644 --- a/io.sc.platform.developer.frontend/package.json +++ b/io.sc.platform.developer.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.developer.frontend", - "version": "8.1.44", + "version": "8.1.46", "description": "", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.287", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/io.sc.platform.developer.frontend/public/configure.js b/io.sc.platform.developer.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.platform.developer.frontend/public/configure.js +++ b/io.sc.platform.developer.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css deleted file mode 100644 index bcbb5386..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Cambria/mathfonts.css +++ /dev/null @@ -1,56 +0,0 @@ -/* -The proprietary Cambria fonts are installed by default on Microsoft Windows 7 -and higher and are provided with some other Microsoft products such as Office. -Some Web services may also provide them as Web fonts. For details, see - http://www.microsoft.com/typography/fonts/family.aspx?FID=291 - http://www.microsoft.com/typography/fonts/family.aspx?FID=360 -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Cambria; - src: local('Cambria'), url('...'); -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold'), url('...'); - font-weight: bold; -} -@font-face { - font-family: Cambria; - src: local('Cambria Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Cambria; - src: local('Cambria Bold Italic'), url('...'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Cambria Math; - src: local('Cambria Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Cambria; -} -m|math { - font-family: Cambria Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 deleted file mode 100644 index c74b7517..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuMathTeXGyre.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 deleted file mode 100644 index c3620b3b..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 deleted file mode 100644 index 3d641e3d..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 deleted file mode 100644 index 163819b5..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif-Italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 deleted file mode 100644 index 51776932..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/DejaVuSerif.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css deleted file mode 100644 index ee48b1d3..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/DejaVu/mathfonts.css +++ /dev/null @@ -1,51 +0,0 @@ -/* -Deja Vu is released under a Free License. See the files in this directory -for details. This fonts is available on most Linux distributions. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: DejaVu Math TeX Gyre; - src: url('DejaVuMathTeXGyre.woff2'), url('DejaVuMathTeXGyre.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif.woff2'), url('DejaVuSerif.woff'); -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Bold.woff2'), url('DejaVuSerif-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-Italic.woff2'), url('DejaVuSerif-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: DejaVu Serif; - src: url('DejaVuSerif-BoldItalic.woff2'), - url('DejaVuSerif-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: DejaVu Serif; -} -m|math { - font-family: DejaVu Math TeX Gyre; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 deleted file mode 100644 index c13030cd..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/FiraMath/FiraMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css deleted file mode 100644 index c05d74d6..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/FiraMath/mathfonts.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -The FiraMath font is released under the SIL Open Font License. See the files in -this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Fira Math; - src: local('Fira Math'), local('FiraMath-Regular'), - url('FiraMath-Regular.woff2'), url('FiraMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - /* TODO: use FiraGO instead? */ - font-family: Fira Math; -} -m|math { - font-family: Fira Math; -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 deleted file mode 100644 index 3c27d39f..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 deleted file mode 100644 index e946d53e..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 deleted file mode 100644 index 0dd7d2ed..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicBoldIt.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 deleted file mode 100644 index e7dfb1d1..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicIt.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 deleted file mode 100644 index 2c488f2a..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/GFSNeohellenicMath.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css deleted file mode 100644 index ea0116c9..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GFS_NeoHellenic/mathfonts.css +++ /dev/null @@ -1,50 +0,0 @@ -/* -The GFS Neohellenic fonts are released under the SIL Open Font License. See the -files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Regular'), - url('GFSNeohellenic.woff2'), - url('GFSNeohellenic.woff'); -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Bold'), - url('GFSNeohellenic-Bold.woff2'), - url('GFSNeohellenic-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-Italic'), - url('GFSNeohellenic-It.woff2'), - url('GFSNeohellenic-It.woff'); - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic; - src: local('GFSNeohellenic-BoldItalic'), - url('GFSNeohellenic-BoldIt.woff2'), - url('GFSNeohellenic-BoldIt.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: GFS Neohellenic Math; - src: local('GFSNeohellenicMath'), - url('GFSNeohellenicMath.woff2'), - url('GFSNeohellenicMath.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: GFS Neohellenic; -} -m|math { - font-family: GFS Neohellenic Math; -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css deleted file mode 100644 index cbf76d3d..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSans/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSans is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSans; - src: url('FreeSans.woff2'), url('FreeSans.woff'); -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBold.woff2'), url('FreeSansBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansOblique.woff2'), url('FreeSansOblique.woff'); - font-style: oblique; -} -@font-face { - font-family: FreeSans; - src: url('FreeSansBoldOblique.woff2'), url('FreeSansBoldOblique.woff'); - font-weight: bold; - font-style: oblique; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSans; -} -m|math { - font-family: FreeSans; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css deleted file mode 100644 index 9572fbfe..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/GNUFreeSerif/mathfonts.css +++ /dev/null @@ -1,47 +0,0 @@ -/* -GNU FreeSerif is released under the GNU General Public License. See the files in -this directory for details. OpenType MATH support is only available in the -development version. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: FreeSerif; - src: url('FreeSerif.woff2'), url('FreeSerif.woff'); -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBold.woff2'), url('FreeSerifBold.woff'); - font-weight: bold; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifItalic.woff2'), url('FreeSerifItalic.woff'); - font-style: italic; -} -@font-face { - font-family: FreeSerif; - src: url('FreeSerifBoldItalic.woff2'), url('FreeSerifBoldItalic.woff'); - font-weight: bold; - font-style: italic; -} - -.htmlmathparagraph, m|mtext { - font-family: FreeSerif; -} -m|math { - font-family: FreeSerif; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 deleted file mode 100644 index 21fe6278..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 deleted file mode 100644 index 9d8c372e..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/EBGaramond12-Regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 deleted file mode 100644 index 72102330..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/Garamond-Math.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css deleted file mode 100644 index f8b1e9df..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Garamond/mathfonts.css +++ /dev/null @@ -1,35 +0,0 @@ -/* -The Garamond fonts are released under the SIL Open Font License. See the files -in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Regular'), - url('EBGaramond12-Regular.woff2'), - url('EBGaramond12-Regular.woff'); -} -@font-face { - font-family: EB Garamond; - src: local('EBGaramond12-Italic'), - url('EBGaramond12-Italic.woff2'), - url('EBGaramond12-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: Garamond Math; - src: local('Garamond-Math'), - url('Garamond-Math.woff2'), - url('Garamond-Math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: EB Garamond; -} -m|math { - font-family: Garamond Math; -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 deleted file mode 100644 index 6110b17b..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/latinmodern-math.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 deleted file mode 100644 index df169efa..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 deleted file mode 100644 index c4ef3ed4..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 deleted file mode 100644 index ae0f344e..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/lmroman12-regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css deleted file mode 100644 index b4b0ceeb..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LatinModern/mathfonts.css +++ /dev/null @@ -1,53 +0,0 @@ -/* -The Latin Modern fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Latin Modern Roman has various sizes. We use the generic name - "Latin Modern Roman" for the local versions and "LMRoman12" for the Web font. -*/ -@font-face { - font-family: LMRoman12; - src: url('lmroman12-regular.woff2'), url('lmroman12-regular.woff'); -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-bold.woff2'), url('lmroman12-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: LMRoman12; - src: url('lmroman12-italic.woff2'), url('lmroman12-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Latin Modern Math; - src: local('Latin Modern Math'), local('LatinModernMath-Regular'), - url('latinmodern-math.woff2'), url('latinmodern-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Latin Modern Roman, LMRoman12; -} -m|math { - font-family: Latin Modern Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 deleted file mode 100644 index c76bab8c..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusmath-regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 deleted file mode 100644 index 34b9f93b..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 deleted file mode 100644 index 19fbf7b9..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 deleted file mode 100644 index dd20fdcf..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 deleted file mode 100644 index a7ef60ef..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/libertinusserif-regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css deleted file mode 100644 index fe6d41c2..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Libertinus/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The Libertinus fonts are released under the SIL Open Font and GPL Licenses. See -the files in this directory for details. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif'), local('LibertinusSerif'), - url('libertinusserif-regular.woff2'), - url('libertinusserif-regular.woff'); -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold'), local('LibertinusSerif-Bold'), - url('libertinusserif-bold.woff2'), - url('libertinusserif-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Italic'), local('LibertinusSerif-Italic'), - url('libertinusserif-italic.woff2'), - url('libertinusserif-italic.woff'); - font-style: italic; -} -@font-face { - font-family: Libertinus Serif; - src: local('Libertinus Serif Bold Italic'), - local('LibertinusSerif-BoldItalic'), - url('libertinusserif-bolditalic.woff2'), - url('libertinusserif-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: Libertinus Math; - src: local('Libertinus Math'), local('LibertinusMath'), - url('libertinusmath-regular.woff2'), - url('libertinusmath-regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Libertinus Serif; -} -m|math { - font-family: Libertinus Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* No math script */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css deleted file mode 100644 index 5f056577..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/LucidaBright/mathfonts.css +++ /dev/null @@ -1,58 +0,0 @@ -/* -The commercial Lucida Bright fonts can be obtained from -http://tug.org/store/lucida/opentype.html and some Web services might -provide them as Web fonts. See also - http://www.microsoft.com/typography/fonts/family.aspx?FID=186 - http://www.microsoft.com/typography/fonts/family.aspx?FID=217 - -Warning: The CSS rules below have not been tested. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright'), url('...'); -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold'), url('...'); - font-weight: bolder; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Italic'), url('...'); - font-style: italic; -} -@font-face { - font-family: Lucida Bright; - src: local('Lucida Bright Demibold Italic'), url('...'); - font-weight: bolder; - font-style: italic; -} -@font-face { - font-family: Lucida Bright Math; - src: local('Lucida Bright Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Lucida Bright; -} -m|math { - font-family: Lucida Bright Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css deleted file mode 100644 index 640b0eaf..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/Minion/mathfonts.css +++ /dev/null @@ -1,37 +0,0 @@ -/* -The commercial Minion Math fonts and can be obtained from -http://www.typoma.com/en/fonts.html and some Web services might provide them as -Web fonts. - -Warning: The CSS rules below have not been tested. More rules should probably -be added to make this work correctly. -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -/* Uncomment and complete the URLs if you wish to use Web fonts */ -/* -@font-face { - font-family: Minion Math; - src: local('Minion Math'), url('...'); -} -*/ - -.htmlmathparagraph, m|mtext { - font-family: Minion Math; -} -m|math { - font-family: Minion Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* TODO: verify whether calligraphic letters are available in this font */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css deleted file mode 100644 index 8df86bf5..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/NeoEuler/mathfonts.css +++ /dev/null @@ -1,34 +0,0 @@ -/* -Neo Euler is released under the SIL Open Font License. See the files in this -directory for details. The font is still in development. The font does not seem -to have a corresponding "non-MATH" font. - -The WOFF fonts have been obtained from -https://github.com/khaledhosny/euler-otf/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: Neo Euler; - src: local('Neo Euler'), url('euler.woff2'), url('euler.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: Neo Euler; -} -m|math { - font-family: Neo Euler; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 deleted file mode 100644 index 279a98f0..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 deleted file mode 100644 index e4394884..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 deleted file mode 100644 index 0dc0baed..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 deleted file mode 100644 index 5594de32..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 deleted file mode 100644 index 263c488a..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/STIXTwoText-Regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css deleted file mode 100644 index 4b287cee..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/STIX/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -The STIX fonts are released under the SIL Open Font License. See the files in -this directory for details. The font can be obtained from several TeX -distributions or package managers. - -The WOFF fonts have been obtained from -http://downloads.sourceforge.net/project/stixfonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - - -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText'), - url('STIXTwoText-Regular.woff2'), - url('STIXTwoText-Regular.woff'); -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Bold'), - url('STIXTwoText-Bold.woff2'), - url('STIXTwoText-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-Italic'), - url('STIXTwoText-Italic.woff2'), - url('STIXTwoText-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: STIX Two Text; - src: local('STIXTwoText-BoldItalic'), - url('STIXTwoText-BoldItalic.woff2'), - url('STIXTwoText-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: STIX Two Math; - src: local('STIXTwoMath-Regular'), - url('STIXTwoMath-Regular.woff2'), - url('STIXTwoMath-Regular.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: STIX Two Text; -} -m|math { - font-family: STIX Two Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values STIX Two Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css deleted file mode 100644 index f7bbeaa0..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/mathfonts.css +++ /dev/null @@ -1,62 +0,0 @@ -/* -The TeX Gyre Bonum fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Regular'), - url('texgyrebonum-regular.woff2'), url('texgyrebonum-regular.woff'); -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Bold'), - url('texgyrebonum-bold.woff2'), url('texgyrebonum-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-Italic'), - url('texgyrebonum-italic.woff2'), url('texgyrebonum-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum; - src: local('TeXGyreBonum-BoldItalic'), - url('texgyrebonum-bolditalic.woff2'), - url('texgyrebonum-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Bonum Math; - src: local('TeX Gyre Bonum Math'), local('TeXGyreBonumMath-Regular'), - url('texgyrebonum-math.woff2'), - url('texgyrebonum-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Bonum; -} -m|math { - font-family: TeX Gyre Bonum Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 deleted file mode 100644 index 013ca1bd..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 deleted file mode 100644 index ae18fb8b..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 deleted file mode 100644 index 42742390..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 deleted file mode 100644 index d16a1cea..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-math.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 deleted file mode 100644 index 8aede98d..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreBonum/texgyrebonum-regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css deleted file mode 100644 index 394686b0..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/mathfonts.css +++ /dev/null @@ -1,63 +0,0 @@ -/* -The TeX Gyre Pagella fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Regular'), - url('texgyrepagella-regular.woff2'), - url('texgyrepagella-regular.woff'); -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Bold'), - url('texgyrepagella-bold.woff2'), url('texgyrepagella-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-Italic'), - url('texgyrepagella-italic.woff2'), url('texgyrepagella-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella; - src: local('TeXGyrePagella-BoldItalic'), - url('texgyrepagella-bolditalic.woff2'), - url('texgyrepagella-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Pagella Math; - src: local('TeX Gyre Pagella Math'), local('TeXGyrePagellaMath-Regular'), - url('texgyrepagella-math.woff2'), - url('texgyrepagella-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Pagella; -} -m|math { - font-family: TeX Gyre Pagella Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 deleted file mode 100644 index 0879c80a..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyrePagella/texgyrepagella-math.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css deleted file mode 100644 index 41c28c6b..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/mathfonts.css +++ /dev/null @@ -1,61 +0,0 @@ -/* -The TeX Gyre Schola fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Regular'), - url('texgyreschola-regular.woff2'), url('texgyreschola-regular.woff'); -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Bold'), - url('texgyreschola-bold.woff2'), url('texgyreschola-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-Italic'), - url('texgyreschola-italic.woff2'), url('texgyreschola-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola; - src: local('TeXGyreSchola-BoldItalic'), - url('texgyreschola-bolditalic.woff2'), - url('texgyreschola-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Schola Math; - src: local('TeX Gyre Schola Math'), local('TeXGyreScholaMath-Regular'), - url('texgyreschola-math.woff2'), url('texgyreschola-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Schola; -} -m|math { - font-family: TeX Gyre Schola Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 deleted file mode 100644 index 485f2c5b..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 deleted file mode 100644 index 6c8c3f52..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 deleted file mode 100644 index afe8d4ef..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 deleted file mode 100644 index 674c4281..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-math.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 deleted file mode 100644 index 0dbec85e..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreSchola/texgyreschola-regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css deleted file mode 100644 index d7a65374..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/mathfonts.css +++ /dev/null @@ -1,60 +0,0 @@ -/* -The TeX Gyre Termes fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://www.gust.org.pl/projects/e-foundry/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Regular'), - url('texgyretermes-regular.woff2'), url('texgyretermes-regular.woff'); -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Bold'), - url('texgyretermes-bold.woff2'), url('texgyretermes-bold.woff'); - font-weight: bold; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-Italic'), - url('texgyretermes-italic.woff2'), url('texgyretermes-italic.woff'); - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes; - src: local('TeXGyreTermes-BoldItalic'), - url('texgyretermes-bolditalic.woff2'), url('texgyretermes-bolditalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: TeX Gyre Termes Math; - src: local('TeX Gyre Termes Math'), local('TeXGyreTermesMath-Regular'), - url('texgyretermes-math.woff2'), url('texgyretermes-math.woff'); -} - -.htmlmathparagraph, m|mtext { - font-family: TeX Gyre Termes; -} -m|math { - font-family: TeX Gyre Termes Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -/* Calligraphic letters do not seem to be available */ -m|*.calligraphic { -} diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 deleted file mode 100644 index a346eb13..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 deleted file mode 100644 index 571a2f07..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-bolditalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 deleted file mode 100644 index 401cd0ec..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 deleted file mode 100644 index 31c9adc2..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-math.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 deleted file mode 100644 index 1a15f9ad..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/TeXGyreTermes/texgyretermes-regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 deleted file mode 100644 index 7a12dd34..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 deleted file mode 100644 index c4daad18..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-BoldItalic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 deleted file mode 100644 index 9d434203..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Italic.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 deleted file mode 100644 index 9acf905c..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITS-Regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 deleted file mode 100644 index c93f7230..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Bold.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 deleted file mode 100644 index fa9345cb..00000000 Binary files a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/XITSMath-Regular.woff2 and /dev/null differ diff --git a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css b/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css deleted file mode 100644 index 9b62b7c3..00000000 --- a/io.sc.platform.developer.frontend/public/webjars/mathfonts/1.0.0/XITS/mathfonts.css +++ /dev/null @@ -1,69 +0,0 @@ -/* -XITS is released under the SIL Open Font License. See the files in this -directory for details. The font can be obtained from several TeX distributions -or package managers. - -The WOFF fonts have been obtained from -http://mirrors.ctan.org/fonts/ -*/ - -@namespace url('http://www.w3.org/1999/xhtml'); -@namespace m url('http://www.w3.org/1998/Math/MathML'); - -@font-face { - font-family: XITS; - src: local('XITS'), - url('XITS-Regular.woff2'), url('XITS-Regular.woff'); -} -@font-face { - font-family: XITS; - src: local('XITS Bold'), local('XITS-Bold'), - url('XITS-Bold.woff2'), url('XITS-Bold.woff'); - font-weight: bold; -} -@font-face { - font-family: XITS; - src: local('XITS Italic'), local('XITS-Italic'), - url('XITS-Italic.woff2'), url('XITS-Italic.woff'); - font-style: italic; -} -@font-face { - font-family: XITS; - src: local('XITS Bold Italic'), local('XITS-BoldItalic'), - url('XITS-BoldItalic.woff2'), url('XITS-BoldItalic.woff'); - font-weight: bold; - font-style: italic; -} -@font-face { - font-family: XITS Math; - src: local('XITS Math'), local('XITSMath-Regular'), - url('XITSMath-Regular.woff2'), url('XITSMath-Regular.woff'); -} -@font-face { - font-family: XITS Math; - src: local('XITS Math Bold'), local('XITSMath-Bold'), - url('XITSMath-Bold.woff2'), url('XITSMathBold.woff'); - font-weight: bold; -} - -.htmlmathparagraph, m|mtext { - font-family: XITS; -} -m|math { - font-family: XITS Math; -} - -.oldstylenumbers { - font-variant-numeric: oldstyle-nums; /* Recommended syntax */ - font-feature-settings: 'onum'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'onum'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'onum'; /* Blink syntax */ -} - -@font-feature-values XITS Math { @styleset { calligraphic: 1; } } -m|*.calligraphic { - font-variant-alternates: styleset(calligraphic); /* Recommended syntax */ - font-feature-settings: 'ss01'; /* OpenType feature syntax */ - -moz-font-feature-settings: 'ss01'; /* Gecko <= 33 syntax */ - -webkit-font-feature-settings: 'ss01'; /* Blink syntax */ -} diff --git a/io.sc.platform.gradle/templates/pgp/app/build.gradle b/io.sc.platform.gradle/templates/pgp/app/build.gradle index a9ecd9b0..d7111a75 100644 --- a/io.sc.platform.gradle/templates/pgp/app/build.gradle +++ b/io.sc.platform.gradle/templates/pgp/app/build.gradle @@ -13,30 +13,31 @@ dependencies { implementation ( project(":io.sc.platform.app"), project(":io.sc.platform.developer"), - //project(":io.sc.platform.security.oauth2.server.authorization"), -// project(":io.sc.platform.security.oauth2.server.resource"), - project(":io.sc.platform.security.loginform"), + project(":io.sc.standard"), + // 调度 project(":io.sc.platform.scheduler.manager"), project(":io.sc.platform.scheduler.executor"), - project(":io.sc.engine.mv"), - project(":io.sc.engine.mv.frontend"), - project(":io.sc.engine.mv.sample"), - + // 规则引擎 project(":io.sc.engine.rule.client"), project(":io.sc.engine.rule.client.spring"), project(":io.sc.engine.rule.core"), project(":io.sc.engine.rule.server"), project(":io.sc.engine.rule.sample"), + // 模型验证 + project(":io.sc.engine.mv"), + project(":io.sc.engine.mv.frontend"), + project(":io.sc.engine.mv.sample"), + + // 压力测试 project(":io.sc.engine.st"), project(":io.sc.engine.st.frontend"), -// project(":erm"), -// project(":erm.frontend"), - - project(":io.sc.standard"), + // 全面风险 + project(":erm"), + project(":erm.frontend"), ) } @@ -77,7 +78,6 @@ bootJar{ } } - jib { outputPaths { tar = "build/libs/${project.name}-${project.version}-image.tar" diff --git a/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt b/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt index b6d116f0..e8a7f8e9 100644 --- a/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt +++ b/io.sc.platform.gradle/templates/pgp/app/src/main/java/app/platform/Application.java.txt @@ -2,16 +2,9 @@ package app.platform; import io.sc.platform.core.ApplicationLauncher; import io.sc.platform.core.PlatformSpringBootServletInitializer; -import io.sc.platform.orm.entity.BaseEntity; -import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; -import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.web.WebApplicationInitializer; -import java.util.Locale; -import java.util.Set; - /** * 应用程序入口 */ @@ -19,12 +12,5 @@ import java.util.Set; public class Application extends PlatformSpringBootServletInitializer implements WebApplicationInitializer { public static void main(String[] args) throws Exception { ApplicationLauncher.run(Application.class,args); -// ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); -// provider.addIncludeFilter(new AssignableTypeFilter(BaseEntity.class)); -// Set components = provider.findCandidateComponents("io.sc"); -// for (BeanDefinition component : components) -// { -// System.out.println(component.getBeanClassName()); -// } } } diff --git a/io.sc.platform.gradle/templates/pgp/app/src/main/resources/app/platform/i18n/messages_zh_CN.properties b/io.sc.platform.gradle/templates/pgp/app/src/main/resources/app/platform/i18n/messages_zh_CN.properties index 01022b8f..0d793ded 100644 --- a/io.sc.platform.gradle/templates/pgp/app/src/main/resources/app/platform/i18n/messages_zh_CN.properties +++ b/io.sc.platform.gradle/templates/pgp/app/src/main/resources/app/platform/i18n/messages_zh_CN.properties @@ -1,3 +1,3 @@ -application.title=\u5B87\u4FE1\u79D1\u6280-\u98CE\u9669\u7BA1\u7406\u5E73\u53F0 +application.title=\u98CE\u9669\u7BA1\u7406\u5E73\u53F0 application.version=$version application.copyright=Copyright \u00A9 2019\u20132022 \ No newline at end of file diff --git a/io.sc.platform.gradle/templates/pgp/setup/build-version.gradle b/io.sc.platform.gradle/templates/pgp/setup/build-version.gradle index 80626d04..e62916d1 100755 --- a/io.sc.platform.gradle/templates/pgp/setup/build-version.gradle +++ b/io.sc.platform.gradle/templates/pgp/setup/build-version.gradle @@ -7,6 +7,13 @@ ext['PlatformDependencyVersions'] =[ "org.checkerframework:checker-qual" : "${checker_version}", "com.google.guava:guava" : "${guava_version}", "com.nimbusds:nimbus-jose-jwt" : "9.22", + "org.codehaus.groovy:groovy" : "3.0.19", + "org.codehaus.groovy:groovy-jsr223" : "3.0.19", + "org.codehaus.groovy:groovy-datetime" : "3.0.19", + "org.codehaus.groovy:groovy-dateutil" : "3.0.19", + "org.codehaus.groovy:groovy-json" : "3.0.19", + "org.codehaus.groovy:groovy-sql" : "3.0.19", + "org.codehaus.groovy:groovy-xml" : "3.0.19", ]; /*********************************************************************** diff --git a/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt b/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt index 431c1d33..8371ab35 100644 --- a/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt +++ b/io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt @@ -682,15 +682,15 @@ subprojects { processResources { if(isFrontendProject(file('.'))) { - exclude("**/${project.name}/*.*"); - if(project.name!='io.sc.platform.mvc.frontend' && project.name!='io.sc.platform.security.frontend'){ -// exclude("**/${project.name}/javascript/codemirror.*"); -// exclude("**/${project.name}/javascript/echarts.*"); -// exclude("**/${project.name}/javascript/platform-core.*"); -// exclude("**/${project.name}/javascript/quasar.*"); -// exclude("**/${project.name}/javascript/vue.*"); -// exclude("**/${project.name}/fonts/*.*"); -// exclude("**/${project.name}/webjars/**/*.*"); + if(project.name!='io.sc.platform.mvc.frontend'){ + exclude("**/${project.name}/*.*"); + exclude("**/${project.name}/javascript/codemirror.*"); + exclude("**/${project.name}/javascript/echarts.*"); + exclude("**/${project.name}/javascript/platform-core.*"); + exclude("**/${project.name}/javascript/quasar.*"); + exclude("**/${project.name}/javascript/vue.*"); + exclude("**/${project.name}/fonts/*.*"); + exclude("**/${project.name}/webjars/**/*.*"); } } } diff --git a/io.sc.platform.gradle/templates/pgp/setup/gradle.properties b/io.sc.platform.gradle/templates/pgp/setup/gradle.properties index 1ee07d56..d2708327 100644 --- a/io.sc.platform.gradle/templates/pgp/setup/gradle.properties +++ b/io.sc.platform.gradle/templates/pgp/setup/gradle.properties @@ -36,9 +36,9 @@ application_version=1.0.0 # platform ########################################################### platform_group=io.sc -platform_version=8.1.44 -platform_plugin_version=8.1.44 -platform_core_frontend_version=8.1.287 +platform_version=8.1.46 +platform_plugin_version=8.1.46 +platform_core_frontend_version=8.1.295 ########################################################### # dependencies version diff --git a/io.sc.platform.lcdp.frontend/package.json b/io.sc.platform.lcdp.frontend/package.json index 42da1ea3..8c6b1673 100644 --- a/io.sc.platform.lcdp.frontend/package.json +++ b/io.sc.platform.lcdp.frontend/package.json @@ -1,6 +1,6 @@ { "name": "io.sc.platform.lcdp.frontend", - "version": "8.1.44", + "version": "8.1.46", "description": "", "private": false, "keywords": [], @@ -92,7 +92,7 @@ "luckyexcel": "1.0.1", "mockjs": "1.1.0", "pinia": "2.1.7", - "platform-core": "8.1.287", + "platform-core": "8.1.295", "quasar": "2.15.4", "tailwindcss": "3.4.4", "vue": "3.4.31", diff --git a/io.sc.platform.lcdp.frontend/public/configure.js b/io.sc.platform.lcdp.frontend/public/configure.js index cffade30..3f4e2e53 100644 --- a/io.sc.platform.lcdp.frontend/public/configure.js +++ b/io.sc.platform.lcdp.frontend/public/configure.js @@ -2,6 +2,8 @@ window.APP = {}; // 全局配置 window.APP.configure ={ + // router 历史模式 + routerHistoryMode: 'web', // 应用上下文路径 webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', // 默认后端 API 请求的服务地址前缀 @@ -20,11 +22,6 @@ window.APP.configure ={ axios : { baseURL: '', timeout: 1000 * 60, - crossdomain: true, - basicAuth: { - enable: true, - username: 'admin', - password: 'admin', - } + crossdomain: true } } \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/404.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/404.html deleted file mode 100644 index ec98e3c2..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/404.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - Page Not Found :( - - - -
-

Not found :(

-

Sorry, but the page you were trying to view does not exist.

-

It looks like this was the result of either:

-
    -
  • a mistyped address
  • -
  • an out-of-date link
  • -
- - -
- - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/browserconfig.xml b/io.sc.platform.lcdp.frontend/public/flowable/modeler/browserconfig.xml deleted file mode 100644 index 006d54a6..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/browserconfig.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - #da532c - - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/cmmn-draw.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/cmmn-draw.js deleted file mode 100644 index c6aaec8e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/cmmn-draw.js +++ /dev/null @@ -1,512 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function _cmmnGetColor(element, defaultColor) -{ - var strokeColor; - if(element.current) { - strokeColor = CURRENT_COLOR; - } else if(element.completed) { - strokeColor = COMPLETED_COLOR; - } else { - strokeColor = defaultColor; - } - return strokeColor; -} - -function _drawPlanModel(planModel) -{ - var rect = paper.rect(planModel.x, planModel.y, planModel.width, planModel.height); - - rect.attr({"stroke-width": 1, - "stroke": "#000000", - "fill": "white" - }); - - if (planModel.name) - { - var planModelName = paper.text(planModel.x + 14, planModel.y + (planModel.height / 2), planModel.name).attr({ - "text-anchor" : "middle", - "font-family" : "Arial", - "font-size" : "12", - "fill" : "#000000" - }); - - planModelName.transform("r270"); - } -} - -function _drawSubProcess(element) -{ - var rect = paper.rect(element.x, element.y, element.width, element.height, 4); - - var strokeColor = _cmmnGetColor(element, MAIN_STROKE_COLOR); - - rect.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); -} - -function _drawServiceTaskTypeIcon(element) -{ - _drawTask(element); - if (element.taskType === "mail") - { - _drawSendTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "camel") - { - _drawCamelTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "mule") - { - _drawMuleTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "http") - { - _drawHttpTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.stencilIconId) - { - paper.image("../service/stencilitem/" + element.stencilIconId + "/icon", element.x + 4, element.y + 4, 16, 16); - } - else - { - _drawServiceTaskIcon(paper, element.x + 4, element.y + 4); - } - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawHttpServiceTask(element) -{ - _drawTask(element); - _drawHttpTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawHumanTask(element) -{ - _drawTask(element); - _drawHumanTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawCaseTask(element) -{ - _drawTask(element); - _drawCaseTaskIcon(paper, element.x + 1, element.y + 1); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawProcessTask(element) -{ - _drawTask(element); - _drawProcessTaskIcon(paper, element.x + 1, element.y + 1); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawScriptTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 5,2 0,0.094 c 0.23706,0.064 0.53189,0.1645 0.8125,0.375 0.5582,0.4186 1.05109,1.228 1.15625,2.5312 l 8.03125,0 1,0 1,0 c 0,-3 -2,-3 -2,-3 l -10,0 z M 4,3 4,13 2,13 c 0,3 2,3 2,3 l 9,0 c 0,0 2,0 2,-3 L 15,6 6,6 6,5.5 C 6,4.1111 5.5595,3.529 5.1875,3.25 4.8155,2.971 4.5,3 4.5,3 L 4,3 z"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#72a7d0" - }); - - var scriptTaskIcon = paper.set(); - scriptTaskIcon.push(path1); - - scriptTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawScriptServiceTask(element) -{ - _drawTask(element); - _drawScriptTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawSendEventServiceTask(element) -{ - _drawTask(element); - _drawSendTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawExternalWorkerServiceTask(element) -{ - _drawTask(element); - _drawServiceTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawDecisionTask(element) -{ - _drawTask(element); - _drawDecisionTaskIcon(paper, element.x + 1, element.y + 1); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawServiceTask(element) -{ - _drawTask(element); - _drawServiceTaskTypeIcon(element); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawTask(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth; - if (strokeColor === ACTIVITY_STROKE_COLOR) { - strokeWidth = TASK_STROKE; - } else { - strokeWidth = TASK_HIGHLIGHT_STROKE; - } - - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 4); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - rectAttrs['fill'] = ACTIVITY_FILL_COLOR; - - rect.attr(rectAttrs); - rect.id = element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11); - } -} - -function _drawTimerEventListener(element) -{ - _drawEventListener(element); - _drawTimerEventListenerIcon(paper, element); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawUserEventListener(element) -{ - _drawEventListener(element); - _drawUserEventListenerIcon(paper, element); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawVariableEventListener(element) -{ - _drawEventListener(element); - _drawVariableEventListenerIcon(paper, element); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawGenericEventListener(element) -{ - _drawEventListener(element); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawEventListener(element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 15); - - circle.attr({"stroke-width": 1, - "stroke": "black", - "fill": "white" - }); - - circle.id = element.id; -} - -function _drawMilestone(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth; - if (strokeColor === ACTIVITY_STROKE_COLOR) { - strokeWidth = TASK_STROKE; - } else { - strokeWidth = TASK_HIGHLIGHT_STROKE; - } - - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 24); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - rectAttrs['fill'] = WHITE_FILL_COLOR; - - rect.attr(rectAttrs); - rect.id = element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11); - } -} - -function _drawStage(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth; - if (strokeColor === ACTIVITY_STROKE_COLOR) { - strokeWidth = TASK_STROKE; - } else { - strokeWidth = TASK_HIGHLIGHT_STROKE; - } - - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 16); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - rectAttrs['fill'] = WHITE_FILL_COLOR; - - rect.attr(rectAttrs); - rect.id = element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x + 10, element.y + 5, element.width, element.height, "start", "top", 11); - } -} - -function _drawPlanModel(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _cmmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth; - if (strokeColor === ACTIVITY_STROKE_COLOR) { - strokeWidth = TASK_STROKE; - } else { - strokeWidth = TASK_HIGHLIGHT_STROKE; - } - - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 4); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - rectAttrs['fill'] = WHITE_FILL_COLOR; - - rect.attr(rectAttrs); - rect.id = element.id; - - var path1 = paper.path("M20 55 L37 34 L275 34 L291 55"); - path1.attr({ - "opacity": 1, - "stroke": strokeColor, - "fill": "#ffffff" - }); - - var planModelHeader = paper.set(); - planModelHeader.push(path1); - - planModelHeader.translate(element.x, element.y - 55); - if (element.name) { - this._drawMultilineText(element.name, element.x + 10, element.y - 16, 275, element.height, "middle", "top", 11); - } -} - -function _drawEntryCriterion(element) -{ - var strokeColor = _cmmnGetColor(element, MAIN_STROKE_COLOR); - - var rhombus = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) + - "L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + element.y + "z" - ); - - // Fill - var gatewayFillColor = WHITE_FILL_COLOR; - - // Opacity - var gatewayOpacity = 1.0; - - rhombus.attr("stroke-width", 1); - rhombus.attr("stroke", strokeColor); - rhombus.attr("fill", gatewayFillColor); - rhombus.attr("fill-opacity", gatewayOpacity); - - rhombus.id = element.id; -} - -function _drawExitCriterion(element) -{ - var strokeColor = _cmmnGetColor(element, MAIN_STROKE_COLOR); - - var rhombus = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) + - "L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + element.y + "z" - ); - - // Fill - var gatewayFillColor = '#000000'; - - // Opacity - var gatewayOpacity = 1.0; - - rhombus.attr("stroke-width", 1); - rhombus.attr("stroke", strokeColor); - rhombus.attr("fill", gatewayFillColor); - rhombus.attr("fill-opacity", gatewayOpacity); - - rhombus.id = element.id; -} - -function _drawMultilineText(text, x, y, boxWidth, boxHeight, horizontalAnchor, verticalAnchor, fontSize) -{ - if (!text || text == "") - { - return; - } - - var textBoxX, textBoxY; - var width = boxWidth - (2 * TEXT_PADDING); - - if (horizontalAnchor === "middle") - { - textBoxX = x + (boxWidth / 2); - } - else if (horizontalAnchor === "start") - { - textBoxX = x; - } - - textBoxY = y + (boxHeight / 2); - - var t = paper.text(textBoxX + TEXT_PADDING, textBoxY + TEXT_PADDING).attr({ - "text-anchor" : horizontalAnchor, - "font-family" : "Arial", - "font-size" : fontSize, - "fill" : "#373e48" - }); - - var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - t.attr({ - "text" : abc - }); - var letterWidth = t.getBBox().width / abc.length; - - t.attr({ - "text" : text - }); - var removedLineBreaks = text.split("\n"); - var x = 0, s = []; - for (var r = 0; r < removedLineBreaks.length; r++) - { - var words = removedLineBreaks[r].split(" "); - for ( var i = 0; i < words.length; i++) { - - var l = words[i].length; - if (x + (l * letterWidth) > width) { - s.push("\n"); - x = 0; - } - x += l * letterWidth; - s.push(words[i] + " "); - } - s.push("\n"); - x = 0; - } - t.attr({ - "text" : s.join("") - }); - - if (verticalAnchor && verticalAnchor === "top") - { - t.attr({"y": y + (t.getBBox().height / 2)}); - } -} - -function _drawAssociation(flow){ - - var polyline = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper); - polyline.element = paper.path(polyline.path); - polyline.element.attr({"stroke-width": ASSOCIATION_STROKE}); - polyline.element.attr({"stroke-dasharray": ". "}); - polyline.element.attr({"stroke":"#585858"}); - - polyline.element.id = flow.id; - - var polylineInvisible = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper); - - polylineInvisible.element = paper.path(polyline.path); - polylineInvisible.element.attr({ - "opacity": 0, - "stroke-width": 8, - "stroke" : "#000000" - }); - - _showTip(jQuery(polylineInvisible.element.node), flow); - - polylineInvisible.element.mouseover(function() { - paper.getById(polyline.element.id).attr({"stroke":"blue"}); - }); - - polylineInvisible.element.mouseout(function() { - paper.getById(polyline.element.id).attr({"stroke":"#585858"}); - }); -} - -function _drawArrowHead(line, connectionType) -{ - var doubleArrowWidth = 2 * ARROW_WIDTH; - - var arrowHead = paper.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2 + .5) + " -" + doubleArrowWidth + "z"); - - // anti smoothing - if (this.strokeWidth%2 == 1) - line.x2 += .5, line.y2 += .5; - - arrowHead.transform("t" + line.x2 + "," + line.y2 + ""); - arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); - - arrowHead.attr("fill", "#585858"); - - arrowHead.attr("stroke-width", SEQUENCEFLOW_STROKE); - arrowHead.attr("stroke", "#585858"); - - return arrowHead; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/cmmn-icons.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/cmmn-icons.js deleted file mode 100644 index 910f2e70..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/cmmn-icons.js +++ /dev/null @@ -1,216 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function _drawHumanTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#d1b575" - }); - - var userTaskIcon = paper.set(); - userTaskIcon.push(path1); - - userTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawServiceTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M 8,1 7.5,2.875 c 0,0 -0.02438,0.250763 -0.40625,0.4375 C 7.05724,3.330353 7.04387,3.358818 7,3.375 6.6676654,3.4929791 6.3336971,3.6092802 6.03125,3.78125 6.02349,3.78566 6.007733,3.77681 6,3.78125 5.8811373,3.761018 5.8125,3.71875 5.8125,3.71875 l -1.6875,-1 -1.40625,1.4375 0.96875,1.65625 c 0,0 0.065705,0.068637 0.09375,0.1875 0.002,0.00849 -0.00169,0.022138 0,0.03125 C 3.6092802,6.3336971 3.4929791,6.6676654 3.375,7 3.3629836,7.0338489 3.3239228,7.0596246 3.3125,7.09375 3.125763,7.4756184 2.875,7.5 2.875,7.5 L 1,8 l 0,2 1.875,0.5 c 0,0 0.250763,0.02438 0.4375,0.40625 0.017853,0.03651 0.046318,0.04988 0.0625,0.09375 0.1129372,0.318132 0.2124732,0.646641 0.375,0.9375 -0.00302,0.215512 -0.09375,0.34375 -0.09375,0.34375 L 2.6875,13.9375 4.09375,15.34375 5.78125,14.375 c 0,0 0.1229911,-0.09744 0.34375,-0.09375 0.2720511,0.147787 0.5795915,0.23888 0.875,0.34375 0.033849,0.01202 0.059625,0.05108 0.09375,0.0625 C 7.4756199,14.874237 7.5,15.125 7.5,15.125 L 8,17 l 2,0 0.5,-1.875 c 0,0 0.02438,-0.250763 0.40625,-0.4375 0.03651,-0.01785 0.04988,-0.04632 0.09375,-0.0625 0.332335,-0.117979 0.666303,-0.23428 0.96875,-0.40625 0.177303,0.0173 0.28125,0.09375 0.28125,0.09375 l 1.65625,0.96875 1.40625,-1.40625 -0.96875,-1.65625 c 0,0 -0.07645,-0.103947 -0.09375,-0.28125 0.162527,-0.290859 0.262063,-0.619368 0.375,-0.9375 0.01618,-0.04387 0.04465,-0.05724 0.0625,-0.09375 C 14.874237,10.52438 15.125,10.5 15.125,10.5 L 17,10 17,8 15.125,7.5 c 0,0 -0.250763,-0.024382 -0.4375,-0.40625 C 14.669647,7.0572406 14.641181,7.0438697 14.625,7 14.55912,6.8144282 14.520616,6.6141566 14.4375,6.4375 c -0.224363,-0.4866 0,-0.71875 0,-0.71875 L 15.40625,4.0625 14,2.625 l -1.65625,1 c 0,0 -0.253337,0.1695664 -0.71875,-0.03125 l -0.03125,0 C 11.405359,3.5035185 11.198648,3.4455201 11,3.375 10.95613,3.3588185 10.942759,3.3303534 10.90625,3.3125 10.524382,3.125763 10.5,2.875 10.5,2.875 L 10,1 8,1 z m 1,5 c 1.656854,0 3,1.3431458 3,3 0,1.656854 -1.343146,3 -3,3 C 7.3431458,12 6,10.656854 6,9 6,7.3431458 7.3431458,6 9,6 z"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#72a7d0" - }); - - var serviceTaskIcon = paper.set(); - serviceTaskIcon.push(path1); - - serviceTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawCaseTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M5 8 L9 4 L18 4 L 21 7"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#000000" - }); - - var path2 = paper.path("M1 23 L1 4 L30 4 L30 23z"); - path2.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var caseTaskIcon = paper.set(); - caseTaskIcon.push(path1); - caseTaskIcon.push(path2); - - caseTaskIcon.translate(startX, startY); - caseTaskIcon.scale(0.7, 0.7); -} - -function _drawProcessTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M1 23 L7 11 L1 0 L30 0 L 35 11 L 30 23z"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var processTaskIcon = paper.set(); - processTaskIcon.push(path1); - - processTaskIcon.translate(startX, startY); - processTaskIcon.scale(0.7, 0.7); -} - -function _drawSendTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z"); - path1.attr({ - "stroke": "none", - "fill": "#16964d" - }); - - var sendTaskIcon = paper.set(); - sendTaskIcon.push(path1); - - sendTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawDecisionTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.9,2.4000386 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var decisionTaskIcon = paper.set(); - decisionTaskIcon.push(path1); - - decisionTaskIcon.translate(startX, startY); - decisionTaskIcon.scale(0.7, 0.7); -} - -function _drawHttpTaskIcon(paper, startX, startY) -{ - var path = paper.path("m 16.704699,5.9229055 q 0.358098,0 0.608767,0.2506681 0.250669,0.250668 0.250669,0.6087677 0,0.3580997 -0.250669,0.6087677 -0.250669,0.2506679 -0.608767,0.2506679 -0.358098,0 -0.608767,-0.2506679 -0.250669,-0.250668 -0.250669,-0.6087677 0,-0.3580997 0.250669,-0.6087677 0.250669,-0.2506681 0.608767,-0.2506681 z m 2.578308,-2.0053502 q -2.229162,0 -3.854034,0.6759125 -1.624871,0.6759067 -3.227361,2.2694472 -0.716197,0.725146 -1.575633,1.7457293 L 7.2329969,8.7876913 Q 7.0897576,8.8055849 7.000233,8.9309334 L 4.9948821,12.368677 q -0.035811,0.06267 -0.035811,0.143242 0,0.107426 0.080572,0.205905 l 0.5729577,0.572957 q 0.125334,0.116384 0.2864786,0.07162 l 2.4708789,-0.760963 2.5156417,2.515645 -0.76096,2.470876 q -0.009,0.02687 -0.009,0.08057 0,0.125338 0.08058,0.205905 l 0.572957,0.572958 q 0.170096,0.152194 0.349146,0.04476 l 3.437744,-2.005351 q 0.125335,-0.08953 0.143239,-0.232763 l 0.17905,-3.392986 q 1.02058,-0.859435 1.745729,-1.575629 1.67411,-1.6830612 2.309735,-3.2049805 0.635625,-1.5219191 0.635625,-3.8585111 0,-0.1253369 -0.08505,-0.2148575 -0.08505,-0.089526 -0.201431,-0.089526 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#16964d" - }); - - startX += -2; - startY += -2; - - path.transform("T" + startX + "," + startY); - -} - -function _drawBusinessRuleTaskIcon(paper, startX, startY) { - var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z"); - path1.attr({ - "stroke": "none", - "fill": "#72a7d0" - }); - - var businessRuleTaskIcon = paper.set(); - businessRuleTaskIcon.push(path1); - - businessRuleTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawTimerEventListenerIcon(paper, element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 10); - - circle.attr({"stroke-width": 1, - "stroke": "black", - "fill": "none" - }); - - var path = paper.path("M 10 0 C 4.4771525 0 0 4.4771525 0 10 C 0 15.522847 4.4771525 20 10 20 C 15.522847 20 20 15.522847 20 10 C 20 4.4771525 15.522847 1.1842379e-15 10 0 z M 9.09375 1.03125 C 9.2292164 1.0174926 9.362825 1.0389311 9.5 1.03125 L 9.5 3.5 L 10.5 3.5 L 10.5 1.03125 C 15.063526 1.2867831 18.713217 4.9364738 18.96875 9.5 L 16.5 9.5 L 16.5 10.5 L 18.96875 10.5 C 18.713217 15.063526 15.063526 18.713217 10.5 18.96875 L 10.5 16.5 L 9.5 16.5 L 9.5 18.96875 C 4.9364738 18.713217 1.2867831 15.063526 1.03125 10.5 L 3.5 10.5 L 3.5 9.5 L 1.03125 9.5 C 1.279102 5.0736488 4.7225326 1.4751713 9.09375 1.03125 z M 9.5 5 L 9.5 8.0625 C 8.6373007 8.2844627 8 9.0680195 8 10 C 8 11.104569 8.8954305 12 10 12 C 10.931981 12 11.715537 11.362699 11.9375 10.5 L 14 10.5 L 14 9.5 L 11.9375 9.5 C 11.756642 8.7970599 11.20294 8.2433585 10.5 8.0625 L 10.5 5 L 9.5 5 z"); - path.attr({ - "stroke": "none", - "fill": "#585858" - }); - path.transform("T" + (element.x + 5) + "," + (element.y + 5)); - return path; -} - -function _drawUserEventListenerIcon(paper, element) { - var userTaskIcon = paper.set(); - var path1 = paper.path("M0.585,24.167h24.083v-7.833c0,0-2.333-3.917-7.083-5.167h-9.25 c-4.417,1.333-7.833,5.75-7.833,5.75L0.585,24.167z"); - path1.attr({"opacity": 1, "stroke": "none", "fill": "#F4F6F7"}); - userTaskIcon.push(path1); - - var path2 = paper.path("M6,20L6,24"); - path2.attr({"opacity": 1, "stroke": "white", "fill": "none"}); - userTaskIcon.push(path2); - - var path3 = paper.path("M20,20L20,24"); - path3.attr({"opacity": 1, "stroke": "white", "fill": "none"}); - userTaskIcon.push(path3); - - var circle = paper.circle(13.002, 5.916, 5.417); - circle.attr({"stroke-width": 1, "stroke": "black", "fill": "#000000"}); - userTaskIcon.push(circle); - - var path4 = paper.path("M8.043,7.083c0,0,2.814-2.426,5.376-1.807s4.624-0.693,4.624-0.693 c0.25,1.688,0.042,3.75-1.458,5.584c0,0,1.083,0.75,1.083,1.5s0.125,1.875-1,3s-5.5,1.25-6.75,0S8.668,12.834,8.668,12 s0.583-1.25,1.25-1.917C8.835,9.5,7.419,7.708,8.043,7.083z"); - path4.attr({"opacity": 1, "stroke": "none", "fill": "#F0EFF0"}); - userTaskIcon.push(path4); - - var x = (element.width / 2) - 2; - var y = (element.height / 2) - 2; - var circle2 = paper.circle(x, y, 17); - circle2.attr({"stroke-width": 1, "stroke": "#F0EFF0", "fill": "none"}); - userTaskIcon.push(circle2); - - userTaskIcon.transform("S0.7,0.7T" + (element.x + 2) + "," + (element.y + 2)); - return userTaskIcon; -} - -function _drawVariableEventListenerIcon(paper, element) { - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 10); - - circle.attr({"stroke-width": 1, - "stroke": "black", - "fill": "none" - }); - - var path = paper.path("M 20.834856,22.874369 L 10.762008,22.873529 L 7.650126,13.293421 L 15.799725,7.3734296 L 23.948336,13.294781 L 20.834856,22.874369 z"); - path.attr({ - "stroke": "#585858", - "fill": "none" - }); - - path.transform("S0.8,0.8T" + (element.x - 1) + "," + (element.y - 1)); - - return path; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.css b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.css deleted file mode 100644 index ddaf36e0..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.css +++ /dev/null @@ -1,24 +0,0 @@ -div[class*='ui-tooltip-flowable-'] { - background-color: #ffffff; - border-color: #c5c5c5; - color: #4a4a4a; - font-family: Verdana; - font-size: 12px; -} - -div[class*='ui-tooltip-flowable-'] .qtip-content { - color: #4a4a4a; - background-color: #ffffff; - font-family: Verdana; - font-size: 12px; -} - -.ui-tooltip-flowable-cmmn .qtip-titlebar { - color: #FFFFFF; - font-size: 12px; - background: #2B414F; -} - -.ui-tooltip-flowable-cmmn .qtip-tip { - background-color: #2B414F; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.html deleted file mode 100644 index a56de7d5..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.js deleted file mode 100644 index a4c2d2ef..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-cmmn/displaymodel.js +++ /dev/null @@ -1,272 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var NORMAL_STROKE = 1; -var ASSOCIATION_STROKE = 2; -var TASK_STROKE = 1; -var TASK_HIGHLIGHT_STROKE = 2; - -var TEXT_COLOR= "#373e48"; -var CURRENT_COLOR= "#017501"; -var HOVER_COLOR= "#666666"; -var ACTIVITY_STROKE_COLOR = "#bbbbbb"; -var ACTIVITY_FILL_COLOR = "#f9f9f9"; -var WHITE_FILL_COLOR = "#ffffff"; -var MAIN_STROKE_COLOR = "#585858"; - -var TEXT_PADDING = 3; -var ARROW_WIDTH = 4; -var MARKER_WIDTH = 12; - -var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Raphael.rgb(0, 0, 0)}; - -// icons -var ICON_SIZE = 16; -var ICON_PADDING = 4; - -var INITIAL_CANVAS_WIDTH; -var INITIAL_CANVAS_HEIGHT; - -var paper; -var viewBox; -var viewBoxWidth; -var viewBoxHeight; - -var canvasWidth; -var canvasHeight; - -var modelDiv = jQuery('#cmmnModel'); -var modelId = modelDiv.attr('data-model-id'); -var historyModelId = modelDiv.attr('data-history-id'); -var caseDefinitionId = modelDiv.attr('data-case-definition-id'); -var modelType = modelDiv.attr('data-model-type'); - -var elementsAdded = new Array(); -var elementsRemoved = new Array(); - -function _showTip(htmlNode, element) -{ - // Default tooltip, no custom tool tip set - if (documentation === undefined) { - var documentation = ""; - if (element.name && element.name.length > 0) { - documentation += "Name: " + element.name + "

"; - } - - if (element.properties) { - for (var i = 0; i < element.properties.length; i++) { - var propName = element.properties[i].name; - if (element.properties[i].type && element.properties[i].type === 'list') { - documentation += '' + propName + ':
'; - for (var j = 0; j < element.properties[i].value.length; j++) { - documentation += '' + element.properties[i].value[j] + '
'; - } - } - else { - documentation += '' + propName + ': ' + element.properties[i].value + '
'; - } - } - } - } - - var text = element.type + " "; - if (element.name && element.name.length > 0) - { - text += element.name; - } - else - { - text += element.id; - } - - htmlNode.qtip({ - content: { - text: documentation, - title: { - text: text - } - }, - position: { - my: 'top left', - at: 'bottom center', - viewport: jQuery('#cmmnModel') - }, - hide: { - fixed: true, delay: 500, - event: 'click mouseleave' - }, - style: { - classes: 'ui-tooltip-flowable-cmmn' - } - }); -} - -function _addHoverLogic(element, type, defaultColor) -{ - var strokeColor = _cmmnGetColor(element, defaultColor); - var topBodyRect = null; - if (type === "rect") - { - topBodyRect = paper.rect(element.x, element.y, element.width, element.height); - } - else if (type === "circle") - { - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - topBodyRect = paper.circle(x, y, 15); - } - else if (type === "rhombus") - { - topBodyRect = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) + - "L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + element.y + "z" - ); - } - - var opacity = 0; - var fillColor = "#ffffff"; - if (jQuery.inArray(element.id, elementsAdded) >= 0) - { - opacity = 0.2; - fillColor = "green"; - } - - if (jQuery.inArray(element.id, elementsRemoved) >= 0) - { - opacity = 0.2; - fillColor = "red"; - } - - topBodyRect.attr({ - "opacity": opacity, - "stroke" : "none", - "fill" : fillColor - }); - _showTip(jQuery(topBodyRect.node), element); - - topBodyRect.mouseover(function() { - paper.getById(element.id).attr({"stroke":HOVER_COLOR}); - }); - - topBodyRect.mouseout(function() { - paper.getById(element.id).attr({"stroke":strokeColor}); - }); -} - -function _zoom(zoomIn) -{ - var tmpCanvasWidth, tmpCanvasHeight; - if (zoomIn) - { - tmpCanvasWidth = canvasWidth * (1.0/0.90); - tmpCanvasHeight = canvasHeight * (1.0/0.90); - } - else - { - tmpCanvasWidth = canvasWidth * (1.0/1.10); - tmpCanvasHeight = canvasHeight * (1.0/1.10); - } - - if (tmpCanvasWidth != canvasWidth || tmpCanvasHeight != canvasHeight) - { - canvasWidth = tmpCanvasWidth; - canvasHeight = tmpCanvasHeight; - paper.setSize(canvasWidth, canvasHeight); - } -} - -var modelUrl; - -if (modelType == 'runtime') { - if (historyModelId) { - modelUrl = FLOWABLE.APP_URL.getCaseInstancesHistoryModelJsonUrl(historyModelId); - } else { - modelUrl = FLOWABLE.APP_URL.getCaseInstancesModelJsonUrl(modelId); - } -} else if (modelType == 'design') { - if (historyModelId) { - modelUrl = FLOWABLE.APP_URL.getModelHistoryModelJsonUrl(modelId, historyModelId); - } else { - modelUrl = FLOWABLE.APP_URL.getModelModelJsonUrl(modelId); - } -} else if (modelType == 'case-definition') { - modelUrl = FLOWABLE.APP_URL.getCaseDefinitionModelJsonUrl(caseDefinitionId); -} - -var request = jQuery.ajax({ - type: 'get', - url: modelUrl + '?nocaching=' + new Date().getTime() -}); - -request.success(function(data, textStatus, jqXHR) { - - if ((!data.elements || data.elements.length == 0) && (!data.pools || data.pools.length == 0)) return; - - INITIAL_CANVAS_WIDTH = data.diagramWidth; - - if (modelType == 'design') { - INITIAL_CANVAS_WIDTH += 20; - } else { - INITIAL_CANVAS_WIDTH += 30; - } - - INITIAL_CANVAS_HEIGHT = data.diagramHeight + 50; - canvasWidth = INITIAL_CANVAS_WIDTH; - canvasHeight = INITIAL_CANVAS_HEIGHT; - viewBoxWidth = INITIAL_CANVAS_WIDTH; - viewBoxHeight = INITIAL_CANVAS_HEIGHT; - - if (modelType == 'design') { - var headerBarHeight = 170; - var offsetY = 0; - if (jQuery(window).height() > (canvasHeight + headerBarHeight)) - { - offsetY = (jQuery(window).height() - headerBarHeight - canvasHeight) / 2; - } - - if (offsetY > 50) { - offsetY = 50; - } - - jQuery('#cmmnModel').css('marginTop', offsetY); - } - - jQuery('#cmmnModel').width(INITIAL_CANVAS_WIDTH); - jQuery('#cmmnModel').height(INITIAL_CANVAS_HEIGHT); - paper = Raphael(document.getElementById('cmmnModel'), canvasWidth, canvasHeight); - paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight, false); - paper.renderfix(); - - var modelElements = data.elements; - for (var i = 0; i < modelElements.length; i++) - { - var element = modelElements[i]; - //try { - var drawFunction = eval("_draw" + element.type); - drawFunction(element); - //} catch(err) {console.log(err);} - } - - if (data.flows) - { - for (var i = 0; i < data.flows.length; i++) - { - var flow = data.flows[i]; - _drawAssociation(flow); - } - } -}); - -request.error(function(jqXHR, textStatus, errorThrown) { - alert("error"); -}); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.css b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.css deleted file mode 100644 index ddaf36e0..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.css +++ /dev/null @@ -1,24 +0,0 @@ -div[class*='ui-tooltip-flowable-'] { - background-color: #ffffff; - border-color: #c5c5c5; - color: #4a4a4a; - font-family: Verdana; - font-size: 12px; -} - -div[class*='ui-tooltip-flowable-'] .qtip-content { - color: #4a4a4a; - background-color: #ffffff; - font-family: Verdana; - font-size: 12px; -} - -.ui-tooltip-flowable-cmmn .qtip-titlebar { - color: #FFFFFF; - font-size: 12px; - background: #2B414F; -} - -.ui-tooltip-flowable-cmmn .qtip-tip { - background-color: #2B414F; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.html deleted file mode 100644 index 11e05965..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.js deleted file mode 100644 index a6a8ad11..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/displaymodel.js +++ /dev/null @@ -1,270 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var NORMAL_STROKE = 1; -var ASSOCIATION_STROKE = 2; -var TASK_STROKE = 1; -var TASK_HIGHLIGHT_STROKE = 2; -var DECISION_SERVICE_STROKE = 3; - -var COMPLETED_COLOR = "#2632aa"; -var TEXT_COLOR= "#373e48"; -var CURRENT_COLOR= "#017501"; -var AVAILABLE_COLOR = "#e3da82"; -var HOVER_COLOR= "#666666"; -var ACTIVITY_STROKE_COLOR = "#bbbbbb"; -var ACTIVITY_FILL_COLOR = "#f9f9f9"; -var WHITE_FILL_COLOR = "#ffffff"; -var MAIN_STROKE_COLOR = "#585858"; - -var TEXT_PADDING = 3; -var ARROW_WIDTH = 4; -var MARKER_WIDTH = 12; - -var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Raphael.rgb(0, 0, 0)}; - -// icons -var ICON_SIZE = 16; -var ICON_PADDING = 4; - -var INITIAL_CANVAS_WIDTH; -var INITIAL_CANVAS_HEIGHT; - -var paper; -var viewBox; -var viewBoxWidth; -var viewBoxHeight; - -var canvasWidth; -var canvasHeight; - -var modelDiv = jQuery('#dmnModel'); -var modelId = modelDiv.attr('data-model-id'); -var historyModelId = modelDiv.attr('data-history-id'); -var decisionDefinitionId = modelDiv.attr('data-decision-definition-id'); -var modelType = modelDiv.attr('data-model-type'); - -var elementsAdded = new Array(); -var elementsRemoved = new Array(); - -function _showTip(htmlNode, element) -{ - // Default tooltip, no custom tool tip set - if (documentation === undefined) { - var documentation = ""; - if (element.name && element.name.length > 0) { - documentation += "Name: " + element.name + "

"; - } - - if (element.properties) { - for (var i = 0; i < element.properties.length; i++) { - var propName = element.properties[i].name; - if (element.properties[i].type && element.properties[i].type === 'list') { - documentation += '' + propName + ':
'; - for (var j = 0; j < element.properties[i].value.length; j++) { - documentation += '' + element.properties[i].value[j] + '
'; - } - } - else { - documentation += '' + propName + ': ' + element.properties[i].value + '
'; - } - } - } - } - - var text = element.type + " "; - if (element.name && element.name.length > 0) - { - text += element.name; - } - else - { - text += element.id; - } - - htmlNode.qtip({ - content: { - text: documentation, - title: { - text: text - } - }, - position: { - my: 'top left', - at: 'bottom center', - viewport: jQuery('#dmnModel') - }, - hide: { - fixed: true, delay: 500, - event: 'click mouseleave' - }, - style: { - classes: 'ui-tooltip-flowable-cmmn' - } - }); -} - -function _addHoverLogic(element, type, defaultColor) -{ - var strokeColor = _dmnGetColor(element, defaultColor); - var topBodyRect = null; - if (type === "rect") - { - topBodyRect = paper.rect(element.x, element.y, element.width, element.height); - } - else if (type === "circle") - { - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - topBodyRect = paper.circle(x, y, 15); - } - else if (type === "rhombus") - { - topBodyRect = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) + - "L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + element.y + "z" - ); - } - - var opacity = 0; - var fillColor = "#ffffff"; - if (jQuery.inArray(element.id, elementsAdded) >= 0) - { - opacity = 0.2; - fillColor = "green"; - } - - if (jQuery.inArray(element.id, elementsRemoved) >= 0) - { - opacity = 0.2; - fillColor = "red"; - } - - topBodyRect.attr({ - "opacity": opacity, - "stroke" : "none", - "fill" : fillColor - }); - _showTip(jQuery(topBodyRect.node), element); - - topBodyRect.mouseover(function() { - paper.getById(element.id).attr({"stroke":HOVER_COLOR}); - paper.getById("divider_"+element.id) != undefined ? paper.getById("divider_"+element.id).attr({"stroke":HOVER_COLOR}) : ''; - }); - - topBodyRect.mouseout(function() { - paper.getById(element.id).attr({"stroke":strokeColor}); - paper.getById("divider_"+element.id) != undefined ? paper.getById("divider_"+element.id).attr({"stroke":strokeColor}) : ''; - }); -} - -function _zoom(zoomIn) -{ - var tmpCanvasWidth, tmpCanvasHeight; - if (zoomIn) - { - tmpCanvasWidth = canvasWidth * (1.0/0.90); - tmpCanvasHeight = canvasHeight * (1.0/0.90); - } - else - { - tmpCanvasWidth = canvasWidth * (1.0/1.10); - tmpCanvasHeight = canvasHeight * (1.0/1.10); - } - - if (tmpCanvasWidth != canvasWidth || tmpCanvasHeight != canvasHeight) - { - canvasWidth = tmpCanvasWidth; - canvasHeight = tmpCanvasHeight; - paper.setSize(canvasWidth, canvasHeight); - } -} - -var modelUrl; -if (modelType == 'decision-service') { - // modelUrl = FLOWABLE.APP_URL.getDgetCaseDefinitionModelJsonUrl(caseDefinitionId); - modelUrl = './app/rest/admin/decisions/decision-service/' + decisionDefinitionId + '/model-json'; -} else if (modelType == 'design') { - if (historyModelId) { - modelUrl = FLOWABLE.APP_URL.getModelHistoryModelJsonUrl(modelId, historyModelId); - } else { - modelUrl = FLOWABLE.APP_URL.getModelModelJsonUrl(modelId); - } -} - -var request = jQuery.ajax({ - type: 'get', - url: modelUrl + '?nocaching=' + new Date().getTime() -}); - -request.success(function(data, textStatus, jqXHR) { - if ((!data.elements || data.elements.length == 0) && (!data.pools || data.pools.length == 0)) return; - - INITIAL_CANVAS_WIDTH = data.diagramWidth; - - if (modelType == 'design') { - INITIAL_CANVAS_WIDTH += 20; - } else { - INITIAL_CANVAS_WIDTH += 30; - } - - INITIAL_CANVAS_HEIGHT = data.diagramHeight + 50; - canvasWidth = INITIAL_CANVAS_WIDTH; - canvasHeight = INITIAL_CANVAS_HEIGHT; - viewBoxWidth = INITIAL_CANVAS_WIDTH; - viewBoxHeight = INITIAL_CANVAS_HEIGHT; - - if (modelType == 'design') { - var headerBarHeight = 170; - var offsetY = 0; - if (jQuery(window).height() > (canvasHeight + headerBarHeight)) - { - offsetY = (jQuery(window).height() - headerBarHeight - canvasHeight) / 2; - } - - if (offsetY > 50) { - offsetY = 50; - } - - jQuery('#dmnModel').css('marginTop', offsetY); - } - - jQuery('#dmnModel').width(INITIAL_CANVAS_WIDTH); - jQuery('#dmnModel').height('100%'); - paper = Raphael(document.getElementById('dmnModel'), canvasWidth, canvasHeight); - paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight, false); - paper.renderfix(); - - var modelElements = data.elements; - for (var i = 0; i < modelElements.length; i++) - { - var element = modelElements[i]; - //try { - var drawFunction = eval("_draw" + element.type); - drawFunction(element); - //} catch(err) {console.log(err);} - } - - if (data.flows) - { - for (var i = 0; i < data.flows.length; i++) - { - var flow = data.flows[i]; - _drawInformationRequirement(flow); - } - } -}); - -request.error(function(jqXHR, textStatus, errorThrown) { - alert("error"); -}); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/dmn-draw.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/dmn-draw.js deleted file mode 100644 index f3d83413..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/dmn-draw.js +++ /dev/null @@ -1,206 +0,0 @@ -function _dmnGetColor(element, defaultColor) -{ - var strokeColor; - if (element.current) { - strokeColor = CURRENT_COLOR; - } else if (element.completed) { - strokeColor = COMPLETED_COLOR; - } else if (element.available) { - strokeColor = AVAILABLE_COLOR; - } else { - strokeColor = defaultColor; - } - return strokeColor; -} - -function _drawDecisionService(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _dmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth = DECISION_SERVICE_STROKE; - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 16); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - rectAttrs['fill'] = WHITE_FILL_COLOR; - - rect.attr(rectAttrs); - rect.id = element.id; - - var dividerElement = element.divider; - var divider = new Polyline("divider_" + element.id, dividerElement.waypoints, ACTIVITY_STROKE_COLOR, paper); - divider.element = paper.path(divider.path); - divider.element.attr({"stroke-width": ASSOCIATION_STROKE}); - divider.element.attr({"stroke":"#bbbbbb"}); - divider.element.id = "divider_" + element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x + 10, element.y + 5, element.width, element.height, "start", "top", 11); - } - - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawDecision(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _dmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth; - if (strokeColor === ACTIVITY_STROKE_COLOR) { - strokeWidth = TASK_STROKE; - } else { - strokeWidth = TASK_HIGHLIGHT_STROKE; - } - - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 4); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - rectAttrs['fill'] = ACTIVITY_FILL_COLOR; - - rect.attr(rectAttrs); - rect.id = element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11); - } - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawInformationRequirement(flow){ - - var polyline = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper); - - var strokeColor = _dmnGetColor(flow, MAIN_STROKE_COLOR); - - polyline.element = paper.path(polyline.path); - polyline.element.attr({"stroke-width": ASSOCIATION_STROKE}); - polyline.element.attr({"stroke":strokeColor}); - - polyline.element.id = flow.id; - - var lastLineIndex = polyline.getLinesCount() - 1; - var line = polyline.getLine(lastLineIndex); - - var polylineInvisible = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper); - - polylineInvisible.element = paper.path(polyline.path); - polylineInvisible.element.attr({ - "opacity": 0, - "stroke-width": 8, - "stroke" : "#000000" - }); - - _showTip(jQuery(polylineInvisible.element.node), flow); - - polylineInvisible.element.mouseover(function() { - paper.getById(polyline.element.id).attr({"stroke":HOVER_COLOR}); - }); - - polylineInvisible.element.mouseout(function() { - paper.getById(polyline.element.id).attr({"stroke":strokeColor}); - }); - - _drawArrowHead(line, strokeColor, paper); - -} - -function _drawMultilineText(text, x, y, boxWidth, boxHeight, horizontalAnchor, verticalAnchor, fontSize) -{ - if (!text || text == "") - { - return; - } - - var textBoxX, textBoxY; - var width = boxWidth - (2 * TEXT_PADDING); - - if (horizontalAnchor === "middle") - { - textBoxX = x + (boxWidth / 2); - } - else if (horizontalAnchor === "start") - { - textBoxX = x; - } - - textBoxY = y + (boxHeight / 2); - - var t = paper.text(textBoxX + TEXT_PADDING, textBoxY + TEXT_PADDING).attr({ - "text-anchor" : horizontalAnchor, - "font-family" : "Arial", - "font-size" : fontSize, - "fill" : "#373e48" - }); - - var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - t.attr({ - "text" : abc - }); - var letterWidth = t.getBBox().width / abc.length; - - t.attr({ - "text" : text - }); - var removedLineBreaks = text.split("\n"); - var x = 0, s = []; - for (var r = 0; r < removedLineBreaks.length; r++) - { - var words = removedLineBreaks[r].split(" "); - for ( var i = 0; i < words.length; i++) { - - var l = words[i].length; - if (x + (l * letterWidth) > width) { - s.push("\n"); - x = 0; - } - x += l * letterWidth; - s.push(words[i] + " "); - } - s.push("\n"); - x = 0; - } - t.attr({ - "text" : s.join("") - }); - - if (verticalAnchor && verticalAnchor === "top") - { - t.attr({"y": y + (t.getBBox().height / 2)}); - } -} - -function _drawArrowHead(line, connectionType) -{ - var doubleArrowWidth = 2 * ARROW_WIDTH; - - var arrowHead = paper.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2 + .5) + " -" + doubleArrowWidth + "z"); - - // anti smoothing - if (this.strokeWidth%2 == 1) - line.x2 += .5, line.y2 += .5; - - arrowHead.transform("t" + line.x2 + "," + line.y2 + ""); - arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); - - arrowHead.attr("fill", "#585858"); - - arrowHead.attr("stroke-width", ASSOCIATION_STROKE); - arrowHead.attr("stroke", "#585858"); - - return arrowHead; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/dmn-icons.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/dmn-icons.js deleted file mode 100644 index e42c643d..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display-dmn/dmn-icons.js +++ /dev/null @@ -1,182 +0,0 @@ -function _drawHumanTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#d1b575" - }); - - var userTaskIcon = paper.set(); - userTaskIcon.push(path1); - - userTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawServiceTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M 8,1 7.5,2.875 c 0,0 -0.02438,0.250763 -0.40625,0.4375 C 7.05724,3.330353 7.04387,3.358818 7,3.375 6.6676654,3.4929791 6.3336971,3.6092802 6.03125,3.78125 6.02349,3.78566 6.007733,3.77681 6,3.78125 5.8811373,3.761018 5.8125,3.71875 5.8125,3.71875 l -1.6875,-1 -1.40625,1.4375 0.96875,1.65625 c 0,0 0.065705,0.068637 0.09375,0.1875 0.002,0.00849 -0.00169,0.022138 0,0.03125 C 3.6092802,6.3336971 3.4929791,6.6676654 3.375,7 3.3629836,7.0338489 3.3239228,7.0596246 3.3125,7.09375 3.125763,7.4756184 2.875,7.5 2.875,7.5 L 1,8 l 0,2 1.875,0.5 c 0,0 0.250763,0.02438 0.4375,0.40625 0.017853,0.03651 0.046318,0.04988 0.0625,0.09375 0.1129372,0.318132 0.2124732,0.646641 0.375,0.9375 -0.00302,0.215512 -0.09375,0.34375 -0.09375,0.34375 L 2.6875,13.9375 4.09375,15.34375 5.78125,14.375 c 0,0 0.1229911,-0.09744 0.34375,-0.09375 0.2720511,0.147787 0.5795915,0.23888 0.875,0.34375 0.033849,0.01202 0.059625,0.05108 0.09375,0.0625 C 7.4756199,14.874237 7.5,15.125 7.5,15.125 L 8,17 l 2,0 0.5,-1.875 c 0,0 0.02438,-0.250763 0.40625,-0.4375 0.03651,-0.01785 0.04988,-0.04632 0.09375,-0.0625 0.332335,-0.117979 0.666303,-0.23428 0.96875,-0.40625 0.177303,0.0173 0.28125,0.09375 0.28125,0.09375 l 1.65625,0.96875 1.40625,-1.40625 -0.96875,-1.65625 c 0,0 -0.07645,-0.103947 -0.09375,-0.28125 0.162527,-0.290859 0.262063,-0.619368 0.375,-0.9375 0.01618,-0.04387 0.04465,-0.05724 0.0625,-0.09375 C 14.874237,10.52438 15.125,10.5 15.125,10.5 L 17,10 17,8 15.125,7.5 c 0,0 -0.250763,-0.024382 -0.4375,-0.40625 C 14.669647,7.0572406 14.641181,7.0438697 14.625,7 14.55912,6.8144282 14.520616,6.6141566 14.4375,6.4375 c -0.224363,-0.4866 0,-0.71875 0,-0.71875 L 15.40625,4.0625 14,2.625 l -1.65625,1 c 0,0 -0.253337,0.1695664 -0.71875,-0.03125 l -0.03125,0 C 11.405359,3.5035185 11.198648,3.4455201 11,3.375 10.95613,3.3588185 10.942759,3.3303534 10.90625,3.3125 10.524382,3.125763 10.5,2.875 10.5,2.875 L 10,1 8,1 z m 1,5 c 1.656854,0 3,1.3431458 3,3 0,1.656854 -1.343146,3 -3,3 C 7.3431458,12 6,10.656854 6,9 6,7.3431458 7.3431458,6 9,6 z"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#72a7d0" - }); - - var serviceTaskIcon = paper.set(); - serviceTaskIcon.push(path1); - - serviceTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawCaseTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M5 8 L9 4 L18 4 L 21 7"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#000000" - }); - - var path2 = paper.path("M1 23 L1 4 L30 4 L30 23z"); - path2.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var caseTaskIcon = paper.set(); - caseTaskIcon.push(path1); - caseTaskIcon.push(path2); - - caseTaskIcon.translate(startX, startY); - caseTaskIcon.scale(0.7, 0.7); -} - -function _drawProcessTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M1 23 L7 11 L1 0 L30 0 L 35 11 L 30 23z"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var processTaskIcon = paper.set(); - processTaskIcon.push(path1); - - processTaskIcon.translate(startX, startY); - processTaskIcon.scale(0.7, 0.7); -} - -function _drawDecisionTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.9,2.4000386 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var decisionTaskIcon = paper.set(); - decisionTaskIcon.push(path1); - - decisionTaskIcon.translate(startX, startY); - decisionTaskIcon.scale(0.7, 0.7); -} - -function _drawHttpTaskIcon(paper, startX, startY) -{ - var path = paper.path("m 16.704699,5.9229055 q 0.358098,0 0.608767,0.2506681 0.250669,0.250668 0.250669,0.6087677 0,0.3580997 -0.250669,0.6087677 -0.250669,0.2506679 -0.608767,0.2506679 -0.358098,0 -0.608767,-0.2506679 -0.250669,-0.250668 -0.250669,-0.6087677 0,-0.3580997 0.250669,-0.6087677 0.250669,-0.2506681 0.608767,-0.2506681 z m 2.578308,-2.0053502 q -2.229162,0 -3.854034,0.6759125 -1.624871,0.6759067 -3.227361,2.2694472 -0.716197,0.725146 -1.575633,1.7457293 L 7.2329969,8.7876913 Q 7.0897576,8.8055849 7.000233,8.9309334 L 4.9948821,12.368677 q -0.035811,0.06267 -0.035811,0.143242 0,0.107426 0.080572,0.205905 l 0.5729577,0.572957 q 0.125334,0.116384 0.2864786,0.07162 l 2.4708789,-0.760963 2.5156417,2.515645 -0.76096,2.470876 q -0.009,0.02687 -0.009,0.08057 0,0.125338 0.08058,0.205905 l 0.572957,0.572958 q 0.170096,0.152194 0.349146,0.04476 l 3.437744,-2.005351 q 0.125335,-0.08953 0.143239,-0.232763 l 0.17905,-3.392986 q 1.02058,-0.859435 1.745729,-1.575629 1.67411,-1.6830612 2.309735,-3.2049805 0.635625,-1.5219191 0.635625,-3.8585111 0,-0.1253369 -0.08505,-0.2148575 -0.08505,-0.089526 -0.201431,-0.089526 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#16964d" - }); - - startX += -2; - startY += -2; - - path.transform("T" + startX + "," + startY); - -} - -function _drawSendEventTaskIcon(paper, startX, startY) -{ - var path = paper.path("m 0.5,2.5 0,13 17,0 0,-13 z M 2,4 6.5,8.5 2,13 z M 4,4 14,4 9,9 z m 12,0 0,9 -4.5,-4.5 z M 7.5,9.5 9,11 10.5,9.5 15,14 3,14 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#72a7d0" - }); - - var sendEventTaskIcon = paper.set(); - sendEventTaskIcon.push(path); - - sendEventTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawBusinessRuleTaskIcon(paper, startX, startY) { - var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z"); - path1.attr({ - "stroke": "none", - "fill": "#72a7d0" - }); - - var businessRuleTaskIcon = paper.set(); - businessRuleTaskIcon.push(path1); - - businessRuleTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawTimerEventListenerIcon(paper, element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 10); - - circle.attr({"stroke-width": 1, - "stroke": "black", - "fill": "none" - }); - - var path = paper.path("M 10 0 C 4.4771525 0 0 4.4771525 0 10 C 0 15.522847 4.4771525 20 10 20 C 15.522847 20 20 15.522847 20 10 C 20 4.4771525 15.522847 1.1842379e-15 10 0 z M 9.09375 1.03125 C 9.2292164 1.0174926 9.362825 1.0389311 9.5 1.03125 L 9.5 3.5 L 10.5 3.5 L 10.5 1.03125 C 15.063526 1.2867831 18.713217 4.9364738 18.96875 9.5 L 16.5 9.5 L 16.5 10.5 L 18.96875 10.5 C 18.713217 15.063526 15.063526 18.713217 10.5 18.96875 L 10.5 16.5 L 9.5 16.5 L 9.5 18.96875 C 4.9364738 18.713217 1.2867831 15.063526 1.03125 10.5 L 3.5 10.5 L 3.5 9.5 L 1.03125 9.5 C 1.279102 5.0736488 4.7225326 1.4751713 9.09375 1.03125 z M 9.5 5 L 9.5 8.0625 C 8.6373007 8.2844627 8 9.0680195 8 10 C 8 11.104569 8.8954305 12 10 12 C 10.931981 12 11.715537 11.362699 11.9375 10.5 L 14 10.5 L 14 9.5 L 11.9375 9.5 C 11.756642 8.7970599 11.20294 8.2433585 10.5 8.0625 L 10.5 5 L 9.5 5 z"); - path.attr({ - "stroke": "none", - "fill": "#585858" - }); - path.transform("T" + (element.x + 5) + "," + (element.y + 5)); - return path; -} - -function _drawUserEventListenerIcon(paper, element) { - var userTaskIcon = paper.set(); - var path1 = paper.path("M0.585,24.167h24.083v-7.833c0,0-2.333-3.917-7.083-5.167h-9.25 c-4.417,1.333-7.833,5.75-7.833,5.75L0.585,24.167z"); - path1.attr({"opacity": 1, "stroke": "none", "fill": "#F4F6F7"}); - userTaskIcon.push(path1); - - var path2 = paper.path("M6,20L6,24"); - path2.attr({"opacity": 1, "stroke": "white", "fill": "none"}); - userTaskIcon.push(path2); - - var path3 = paper.path("M20,20L20,24"); - path3.attr({"opacity": 1, "stroke": "white", "fill": "none"}); - userTaskIcon.push(path3); - - var circle = paper.circle(13.002, 5.916, 5.417); - circle.attr({"stroke-width": 1, "stroke": "black", "fill": "#000000"}); - userTaskIcon.push(circle); - - var path4 = paper.path("M8.043,7.083c0,0,2.814-2.426,5.376-1.807s4.624-0.693,4.624-0.693 c0.25,1.688,0.042,3.75-1.458,5.584c0,0,1.083,0.75,1.083,1.5s0.125,1.875-1,3s-5.5,1.25-6.75,0S8.668,12.834,8.668,12 s0.583-1.25,1.25-1.917C8.835,9.5,7.419,7.708,8.043,7.083z"); - path4.attr({"opacity": 1, "stroke": "none", "fill": "#F0EFF0"}); - userTaskIcon.push(path4); - - var x = (element.width / 2) - 2; - var y = (element.height / 2) - 2; - var circle2 = paper.circle(x, y, 17); - circle2.attr({"stroke-width": 1, "stroke": "#F0EFF0", "fill": "none"}); - userTaskIcon.push(circle2); - - userTaskIcon.transform("S0.7,0.7" + "T" + (element.x + 2) + "," + (element.y + 2)); - return userTaskIcon; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/.gitignore b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/.gitignore deleted file mode 100644 index 26e82b02..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/dist -/node_modules -/displaymodel_temp.html diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/Gruntfile.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/Gruntfile.js deleted file mode 100644 index 9aac21f5..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/Gruntfile.js +++ /dev/null @@ -1,153 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -module.exports = function (grunt) { - - require('load-grunt-tasks')(grunt); - require('time-grunt')(grunt); - - grunt.initConfig({ - yeoman: { - app: require('./package.json').appPath || 'app', - dist: 'dist' - }, - clean: { - dist: { - files: [ - { - dot: true, - src: [ - '.tmp', - '<%= yeoman.dist %>/*', - '!<%= yeoman.dist %>/.git*' - ] - } - ] - }, - server: '.tmp' - }, - useminPrepare: { - html: 'displaymodel.html', - options: { - dest: '<%= yeoman.dist %>/' - } - }, - usemin: { - html: ['<%= yeoman.dist %>/{,*/}*.html'], - css: ['<%= yeoman.dist %>/display/styles/{,*/}*.css'], - options: { - dirs: ['<%= yeoman.dist %>'] - } - }, - // Put files not handled in other tasks here - copy: { - dist: { - files: [{ - expand: true, - dot: true, - cwd: '.', - dest: '<%= yeoman.dist %>', - src: [ - 'fonts/*' - ] - }, { - expand: true, - cwd: '.tmp/images', - dest: '<%= yeoman.dist %>/images', - src: [ - 'generated/*' - ] - }] - }, - styles: { - expand: true, - cwd: 'styles', - dest: '.tmp/styles/', - src: '{,*/}*.css' - }, - index: { - expand: true, - cwd: './', - src: ['*.html', 'views/**/**.html'], - dest: '<%= yeoman.dist %>' - }, - copyCss : { - files: [ - {expand: true, cwd:'.tmp/concat/display/styles/', src:'*.css', dest:'<%= yeoman.dist %>/display/styles/', filter: 'isFile'} - ] - }, - copyJs : { - files: [ - {expand: true, cwd:'.tmp/concat/display/scripts', src:'*.js', dest:'<%= yeoman.dist %>/display/scripts/', filter: 'isFile'} - ] - }, - }, - ngAnnotate: { - dist: { - files: [ - { - expand: true, - cwd: '.tmp/concat/display/scripts', - src: '*.js', - dest: '.tmp/concat/display/scripts' - } - ] - } - }, - uglify: { - dist: { - options: { - mangle: true - }, - files: { - '<%= yeoman.dist %>/display/scripts/displaymodel-logic.js': [ - '<%= yeoman.dist %>/display/scripts/displaymodel-logic.js' - ] - } - } - }, - rev: { - dist: { - files: { - src: [ - '<%= yeoman.dist %>/display/{,*/}*.js', - '<%= yeoman.dist %>/display/{,*/}*.css', - '<%= yeoman.dist %>/{,*/}*.{png,jpg,jpeg,gif,webp,svg}' - ] - } - } - } - }); - - grunt.registerTask('buildApp', [ - 'clean:dist', - 'useminPrepare', - 'copy:styles', - 'concat', - 'copy:dist', - 'ngAnnotate', - 'copy:copyCss', - 'copy:copyJs', - 'copy:index', - 'uglify', - 'rev', - 'usemin' - ]); - - - grunt.registerTask('default', [ - 'buildApp' - ]); - -}; diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/Polyline.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/Polyline.js deleted file mode 100644 index aafef8f4..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/Polyline.js +++ /dev/null @@ -1,387 +0,0 @@ -/* Copyright 2005-2015 Alfresco Software, Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Class to generate polyline - * - * @author Dmitry Farafonov - */ - -var ANCHOR_TYPE= { - main: "main", - middle: "middle", - first: "first", - last: "last" -}; - -function Anchor(uuid, type, x, y) { - this.uuid = uuid; - this.x = x; - this.y = y; - this.type = (type == ANCHOR_TYPE.middle) ? ANCHOR_TYPE.middle : ANCHOR_TYPE.main; -}; -Anchor.prototype = { - uuid: null, - x: 0, - y: 0, - type: ANCHOR_TYPE.main, - isFirst: false, - isLast: false, - ndex: 0, - typeIndex: 0 -}; - -function Polyline(uuid, points, strokeWidth, paper) { - /* Array on coordinates: - * points: [{x: 410, y: 110}, 1 - * {x: 570, y: 110}, 1 2 - * {x: 620, y: 240}, 2 3 - * {x: 750, y: 270}, 3 4 - * {x: 650, y: 370}]; 4 - */ - this.points = points; - - /* - * path for graph - * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] - */ - this.path = []; - - this.anchors = []; - - if (strokeWidth) this.strokeWidth = strokeWidth; - - this.paper = paper; - - this.closePath = false; - - this.init(); -}; - -Polyline.prototype = { - id: null, - points: [], - path: [], - anchors: [], - strokeWidth: 1, - radius: 1, - showDetails: false, - paper: null, - element: null, - isDefaultConditionAvailable: false, - closePath: false, - - init: function(points){ - var linesCount = this.getLinesCount(); - if (linesCount < 1) - return; - - this.normalizeCoordinates(); - - // create anchors - - this.pushAnchor(ANCHOR_TYPE.first, this.getLine(0).x1, this.getLine(0).y1); - - for (var i = 1; i < linesCount; i++) - { - var line1 = this.getLine(i-1); - this.pushAnchor(ANCHOR_TYPE.main, line1.x2, line1.y2); - } - - this.pushAnchor(ANCHOR_TYPE.last, this.getLine(linesCount-1).x2, this.getLine(linesCount-1).y2); - - this.rebuildPath(); - }, - - normalizeCoordinates: function(){ - for(var i=0; i < this.points.length; i++){ - this.points[i].x = parseFloat(this.points[i].x); - this.points[i].y = parseFloat(this.points[i].y); - } - }, - - getLinesCount: function(){ - return this.points.length-1; - }, - _getLine: function(i){ - if (this.points.length > i && this.points[i]) { - return {x1: this.points[i].x, y1: this.points[i].y, x2: this.points[i+1].x, y2: this.points[i+1].y}; - } else { - return undefined; - } - }, - getLine: function(i){ - var line = this._getLine(i); - if (line != undefined) { - line.angle = this.getLineAngle(i); - } - return line; - }, - getLineAngle: function(i){ - var line = this._getLine(i); - return Math.atan2(line.y2 - line.y1, line.x2 - line.x1); - }, - getLineLengthX: function(i){ - var line = this.getLine(i); - return (line.x2 - line.x1); - }, - getLineLengthY: function(i){ - var line = this.getLine(i); - return (line.y2 - line.y1); - }, - getLineLength: function(i){ - return Math.sqrt(Math.pow(this.getLineLengthX(i), 2) + Math.pow(this.getLineLengthY(i), 2)); - }, - - getAnchors: function(){ - return this.anchors; - }, - getAnchorsCount: function(type){ - if (!type) - return this.anchors.length; - else { - var count = 0; - for(var i=0; i < this.getAnchorsCount(); i++){ - var anchor = this.anchors[i]; - if (anchor.getType() == type) { - count++; - } - } - return count; - } - }, - - pushAnchor: function(type, x, y, index){ - if (type == ANCHOR_TYPE.first) { - index = 0; - typeIndex = 0; - } else if (type == ANCHOR_TYPE.last) { - index = this.getAnchorsCount(); - typeIndex = 0; - } else if (!index) { - index = this.anchors.length; - } else { - for(var i=0; i < this.getAnchorsCount(); i++){ - var anchor = this.anchors[i]; - if (anchor.index > index) { - anchor.index++; - anchor.typeIndex++; - } - } - } - - var anchor = new Anchor(this.id, ANCHOR_TYPE.main, x, y, index, typeIndex); - - this.anchors.push(anchor); - }, - - getAnchor: function(position){ - return this.anchors[position]; - }, - - getAnchorByType: function(type, position){ - if (type == ANCHOR_TYPE.first) - return this.anchors[0]; - if (type == ANCHOR_TYPE.last) - return this.anchors[this.getAnchorsCount()-1]; - - for(var i=0; i < this.getAnchorsCount(); i++){ - var anchor = this.anchors[i]; - if (anchor.type == type) { - if( position == anchor.position) - return anchor; - } - } - return null; - }, - - addNewPoint: function(position, x, y){ - // - for(var i = 0; i < this.getLinesCount(); i++){ - var line = this.getLine(i); - if (x > line.x1 && x < line.x2 && y > line.y1 && y < line.y2) { - this.points.splice(i+1,0,{x: x, y: y}); - break; - } - } - - this.rebuildPath(); - }, - - rebuildPath: function(){ - var path = []; - - for(var i = 0; i < this.getAnchorsCount(); i++){ - var anchor = this.getAnchor(i); - - var pathType = ""; - if (i == 0) - pathType = "M"; - else - pathType = "L"; - - // TODO: save previous points and calculate new path just if points are updated, and then save currents values as previous - - var targetX = anchor.x, targetY = anchor.y; - if (i>0 && i < this.getAnchorsCount()-1) { - // get new x,y - var cx = anchor.x, cy = anchor.y; - - // pivot point of prev line - var AO = this.getLineLength(i-1); - if (AO < this.radius) { - AO = this.radius; - } - - this.isDefaultConditionAvailable = (this.isDefaultConditionAvailable || (i == 1 && AO > 10)); - - var ED = this.getLineLengthY(i-1) * this.radius / AO; - var OD = this.getLineLengthX(i-1) * this.radius / AO; - targetX = anchor.x - OD; - targetY = anchor.y - ED; - - if (AO < 2*this.radius && i>1) { - targetX = anchor.x - this.getLineLengthX(i-1)/2; - targetY = anchor.y - this.getLineLengthY(i-1)/2;; - } - - // pivot point of next line - var AO = this.getLineLength(i); - if (AO < this.radius) { - AO = this.radius; - } - var ED = this.getLineLengthY(i) * this.radius / AO; - var OD = this.getLineLengthX(i) * this.radius / AO; - var nextSrcX = anchor.x + OD; - var nextSrcY = anchor.y + ED; - - if (AO < 2*this.radius && i 10)); - } - - // anti smoothing - if (this.strokeWidth%2 == 1) { - targetX += 0.5; - targetY += 0.5; - } - - path.push([pathType, targetX, targetY]); - - if (i>0 && i < this.getAnchorsCount()-1) { - path.push(["C", ax, ay, bx, by, zx, zy]); - } - } - - if (this.closePath) - { - path.push(["Z"]); - } - - this.path = path; - }, - - transform: function(transformation) - { - this.element.transform(transformation); - }, - attr: function(attrs) - { - // TODO: foreach and set each - this.element.attr(attrs); - } -}; - -function Polygone(points, strokeWidth) { - /* Array on coordinates: - * points: [{x: 410, y: 110}, 1 - * {x: 570, y: 110}, 1 2 - * {x: 620, y: 240}, 2 3 - * {x: 750, y: 270}, 3 4 - * {x: 650, y: 370}]; 4 - */ - this.points = points; - - /* - * path for graph - * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] - */ - this.path = []; - - this.anchors = []; - - if (strokeWidth) this.strokeWidth = strokeWidth; - - this.closePath = true; - this.init(); -}; - - -/* - * Poligone is inherited from Poliline: draws closedPath of polyline - */ - -var Foo = function () { }; -Foo.prototype = Polyline.prototype; - -Polygone.prototype = new Foo(); - -Polygone.prototype.rebuildPath = function(){ - var path = []; - for(var i = 0; i < this.getAnchorsCount(); i++){ - var anchor = this.getAnchor(i); - - var pathType = ""; - if (i == 0) - pathType = "M"; - else - pathType = "L"; - - var targetX = anchor.x, targetY = anchor.y; - - // anti smoothing - if (this.strokeWidth%2 == 1) { - targetX += 0.5; - targetY += 0.5; - } - - path.push([pathType, targetX, targetY]); - } - if (this.closePath) - path.push(["Z"]); - - this.path = path; -}; diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/bpmn-draw.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/bpmn-draw.js deleted file mode 100644 index ee244659..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/bpmn-draw.js +++ /dev/null @@ -1,880 +0,0 @@ -/* Copyright 2005-2015 Alfresco Software, Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _bpmnGetColor(element, defaultColor) -{ - var strokeColor; - if(element.current) { - strokeColor = CURRENT_COLOR; - } else if(element.completed) { - strokeColor = COMPLETED_COLOR; - } else { - strokeColor = defaultColor; - } - return strokeColor; -} - -function _drawPool(pool) -{ - var rect = paper.rect(pool.x, pool.y, pool.width, pool.height); - - rect.attr({"stroke-width": 1, - "stroke": "#000000", - "fill": "white" - }); - - if (pool.name) - { - var poolName = paper.text(pool.x + 14, pool.y + (pool.height / 2), pool.name).attr({ - "text-anchor" : "middle", - "font-family" : "Arial", - "font-size" : "12", - "fill" : "#000000" - }); - - poolName.transform("r270"); - } - - if (pool.lanes) - { - for (var i = 0; i < pool.lanes.length; i++) - { - var lane = pool.lanes[i]; - _drawLane(lane); - } - } -} - -function _drawLane(lane) -{ - var rect = paper.rect(lane.x, lane.y, lane.width, lane.height); - - rect.attr({"stroke-width": 1, - "stroke": "#000000", - "fill": "white" - }); - - if (lane.name) - { - var laneName = paper.text(lane.x + 10, lane.y + (lane.height / 2), lane.name).attr({ - "text-anchor" : "middle", - "font-family" : "Arial", - "font-size" : "12", - "fill" : "#000000" - }); - - laneName.transform("r270"); - } -} - -function _drawSubProcess(element) -{ - var rect = paper.rect(element.x, element.y, element.width, element.height, 4); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - rect.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); -} - -function _drawTransaction(element) -{ - var rect = paper.rect(element.x, element.y, element.width, element.height, 4); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - rect.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); - - var borderRect = paper.rect(element.x + 2, element.y + 2, element.width - 4, element.height -4, 4); - - borderRect.attr({"stroke-width": 1, - "stroke": "black", - "fill": "none" - }); -} - -function _drawEventSubProcess(element) -{ - var rect = paper.rect(element.x, element.y, element.width, element.height, 4); - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - rect.attr({"stroke-width": 1, - "stroke": strokeColor, - "stroke-dasharray": ".", - "fill": "white" - }); -} - -function _drawAdhocSubProcess(element) -{ - var rect = paper.rect(element.x, element.y, element.width, element.height, 4); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - rect.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); - - paper.text(element.x + (element.width / 2), element.y + element.height - 8).attr({ - "text-anchor" : "middle", - "font-family" : "Arial", - "font-size" : 20, - "text" : "~", - "fill" : "#373e48" - }); -} - -function _drawStartEvent(element) -{ - var startEvent = _drawEvent(element, NORMAL_STROKE, 15); - startEvent.click(function() { - _zoom(true); - }); - _addHoverLogic(element, "circle", MAIN_STROKE_COLOR); -} - -function _drawEndEvent(element) -{ - var endEvent = _drawEvent(element, ENDEVENT_STROKE, 14); - endEvent.click(function() { - _zoom(false); - }); - _addHoverLogic(element, "circle", MAIN_STROKE_COLOR); -} - -function _drawEvent(element, strokeWidth, radius) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, radius); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - // Fill - var eventFillColor = _determineCustomFillColor(element, "#ffffff"); - - // Opacity - var eventOpacity = 1.0; - if (customActivityBackgroundOpacity) { - eventOpacity = customActivityBackgroundOpacity; - } - - if (element.interrupting === undefined || element.interrupting) { - circle.attr({ - "stroke-width": strokeWidth, - "stroke": strokeColor, - "fill": eventFillColor, - "fill-opacity": eventOpacity - }); - - } else { - circle.attr({ - "stroke-width": strokeWidth, - "stroke": strokeColor, - "stroke-dasharray": ".", - "fill": eventFillColor, - "fill-opacity": eventOpacity - }); - } - - circle.id = element.id; - - _drawEventIcon(paper, element); - - return circle; -} - -function _drawServiceTask(element) -{ - _drawTask(element); - if (element.taskType === "mail") - { - _drawSendTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "camel") - { - _drawCamelTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "mule") - { - _drawMuleTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "http") - { - _drawHttpTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "shell") - { - _drawShellTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.taskType === "dmn") { - _drawDecisionTaskIcon(paper, element.x + 4, element.y + 4); - } - else if (element.stencilIconId) - { - paper.image("../service/stencilitem/" + element.stencilIconId + "/icon", element.x + 4, element.y + 4, 16, 16); - } - else - { - _drawServiceTaskIcon(paper, element.x + 4, element.y + 4); - } - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawSendEventServiceTask(element) -{ - _drawTask(element); - _drawSendTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawExternalWorkerServiceTask(element) -{ - _drawTask(element); - _drawServiceTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawHttpServiceTask(element) -{ - _drawTask(element); - _drawHttpTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawCallActivity(element) -{ - var width = element.width - (CALL_ACTIVITY_STROKE / 2); - var height = element.height - (CALL_ACTIVITY_STROKE / 2); - - var rect = paper.rect(element.x, element.y, width, height, 4); - - var strokeColor = _bpmnGetColor(element, ACTIVITY_STROKE_COLOR); - - // Fill - var callActivityFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - - // Opacity - var callActivityOpacity = 1.0; - if (customActivityBackgroundOpacity) { - callActivityOpacity = customActivityBackgroundOpacity; - } - - rect.attr({"stroke-width": CALL_ACTIVITY_STROKE, - "stroke": strokeColor, - "fill": callActivityFillColor, - "fill-opacity": callActivityOpacity - }); - - rect.id = element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11); - } - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawScriptTask(element) -{ - _drawTask(element); - _drawScriptTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawUserTask(element) -{ - _drawTask(element); - _drawUserTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawBusinessRuleTask(element) -{ - _drawTask(element); - _drawBusinessRuleTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawManualTask(element) -{ - _drawTask(element); - _drawManualTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawSendTask(element) -{ - _drawTask(element); - _drawSendTaskIcon(paper, element.x + 4, element.y + 4); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawReceiveTask(element) -{ - _drawTask(element); - _drawReceiveTaskIcon(paper, element.x, element.y); - _addHoverLogic(element, "rect", ACTIVITY_STROKE_COLOR); -} - -function _drawTask(element) -{ - var rectAttrs = {}; - - // Stroke - var strokeColor = _bpmnGetColor(element, ACTIVITY_STROKE_COLOR); - rectAttrs['stroke'] = strokeColor; - - var strokeWidth; - if (strokeColor === ACTIVITY_STROKE_COLOR) { - strokeWidth = TASK_STROKE; - } else { - strokeWidth = TASK_HIGHLIGHT_STROKE; - } - - var width = element.width - (strokeWidth / 2); - var height = element.height - (strokeWidth / 2); - - var rect = paper.rect(element.x, element.y, width, height, 4); - rectAttrs['stroke-width'] = strokeWidth; - - // Fill - var fillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - rectAttrs['fill'] = fillColor; - - // Opacity - if (customActivityBackgroundOpacity) { - rectAttrs['fill-opacity'] = customActivityBackgroundOpacity; - } - - rect.attr(rectAttrs); - rect.id = element.id; - - if (element.name) { - this._drawMultilineText(element.name, element.x, element.y, element.width, element.height, "middle", "middle", 11); - } -} - -function _drawExclusiveGateway(element) -{ - _drawGateway(element); - var quarterWidth = element.width / 4; - var quarterHeight = element.height / 4; - - var iks = paper.path( - "M" + (element.x + quarterWidth + 3) + " " + (element.y + quarterHeight + 3) + - "L" + (element.x + 3 * quarterWidth - 3) + " " + (element.y + 3 * quarterHeight - 3) + - "M" + (element.x + quarterWidth + 3) + " " + (element.y + 3 * quarterHeight - 3) + - "L" + (element.x + 3 * quarterWidth - 3) + " " + (element.y + quarterHeight + 3) - ); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - // Fill - var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - - // Opacity - var gatewayOpacity = 1.0; - if (customActivityBackgroundOpacity) { - gatewayOpacity = customActivityBackgroundOpacity; - } - - - iks.attr({"stroke-width": 3, "stroke": strokeColor, "fill": gatewayFillColor, "fill-opacity": gatewayOpacity}); - - _addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR); -} - -function _drawParallelGateway(element) -{ - _drawGateway(element); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - var path1 = paper.path("M 6.75,16 L 25.75,16 M 16,6.75 L 16,25.75"); - - // Fill - var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - - // Opacity - var gatewayOpacity = 1.0; - if (customActivityBackgroundOpacity) { - gatewayOpacity = customActivityBackgroundOpacity; - } - - path1.attr({ - "stroke-width": 3, - "stroke": strokeColor, - "fill": gatewayFillColor, - "fill-opacity": gatewayOpacity - }); - - path1.transform("T" + (element.x + 4) + "," + (element.y + 4)); - - _addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR); -} - -function _drawInclusiveGateway(element) -{ - _drawGateway(element); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - var circle1 = paper.circle(element.x + (element.width / 2), element.y + (element.height / 2), 9.75); - - // Fill - var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - - // Opacity - var gatewayOpacity = 1.0; - if (customActivityBackgroundOpacity) { - gatewayOpacity = customActivityBackgroundOpacity; - } - - circle1.attr({ - "stroke-width": 2.5, - "stroke": strokeColor, - "fill": gatewayFillColor, - "fill-opacity": gatewayOpacity - }); - - _addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR); -} - -function _drawEventGateway(element) -{ - _drawGateway(element); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - var circle1 = paper.circle(element.x + (element.width / 2), element.y + (element.height / 2), 10.4); - - // Fill - var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - - // Opacity - var gatewayOpacity = 1.0; - if (customActivityBackgroundOpacity) { - gatewayOpacity = customActivityBackgroundOpacity; - } - - circle1.attr({ - "stroke-width": 0.5, - "stroke": strokeColor, - "fill": gatewayFillColor, - "fill-opacity": gatewayOpacity - }); - - var circle2 = paper.circle(element.x + (element.width / 2), element.y + (element.height / 2), 11.7); - circle2.attr({ - "stroke-width": 0.5, - "stroke": strokeColor, - "fill": gatewayFillColor, - "fill-opacity": gatewayOpacity - }); - - var path1 = paper.path("M 20.327514,22.344972 L 11.259248,22.344216 L 8.4577203,13.719549 L 15.794545,8.389969 L 23.130481,13.720774 L 20.327514,22.344972 z"); - path1.attr({ - "stroke-width": 1.39999998, - "stroke": strokeColor, - "fill": gatewayFillColor, - "fill-opacity": gatewayOpacity, - "stroke-linejoin": "bevel" - }); - - path1.transform("T" + (element.x + 4) + "," + (element.y + 4)); - - _addHoverLogic(element, "rhombus", MAIN_STROKE_COLOR); -} - -function _drawGateway(element) -{ - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - var rhombus = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) + - "L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + element.y + "z" - ); - - // Fill - var gatewayFillColor = _determineCustomFillColor(element, ACTIVITY_FILL_COLOR); - - // Opacity - var gatewayOpacity = 1.0; - if (customActivityBackgroundOpacity) { - gatewayOpacity = customActivityBackgroundOpacity; - } - - rhombus.attr("stroke-width", 2); - rhombus.attr("stroke", strokeColor); - rhombus.attr("fill", gatewayFillColor); - rhombus.attr("fill-opacity", gatewayOpacity); - - rhombus.id = element.id; - - return rhombus; -} - -function _drawBoundaryEvent(element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 15); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - if (element.cancelActivity) { - circle.attr({ - "stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); - - } else { - circle.attr({ - "stroke-width": 1, - "stroke-dasharray": ".", - "stroke": strokeColor, - "fill": "white" - }); - } - - var innerCircle = paper.circle(x, y, 12); - - if (element.cancelActivity) { - innerCircle.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "none" - }); - - } else { - innerCircle.attr({ - "stroke-width": 1, - "stroke-dasharray": ".", - "stroke": strokeColor, - "fill": "none" - }); - } - - _drawEventIcon(paper, element); - _addHoverLogic(element, "circle", MAIN_STROKE_COLOR); - - circle.id = element.id; - innerCircle.id = element.id + "_inner"; -} - -function _drawIntermediateCatchEvent(element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 15); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - circle.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); - - var innerCircle = paper.circle(x, y, 12); - - innerCircle.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "none" - }); - - _drawEventIcon(paper, element); - _addHoverLogic(element, "circle", MAIN_STROKE_COLOR); - - circle.id = element.id; - innerCircle.id = element.id + "_inner"; -} - -function _drawThrowEvent(element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 15); - - var strokeColor = _bpmnGetColor(element, MAIN_STROKE_COLOR); - - circle.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "white" - }); - - var innerCircle = paper.circle(x, y, 12); - - innerCircle.attr({"stroke-width": 1, - "stroke": strokeColor, - "fill": "none" - }); - - _drawEventIcon(paper, element); - _addHoverLogic(element, "circle", MAIN_STROKE_COLOR); - - circle.id = element.id; - innerCircle.id = element.id + "_inner"; -} - -function _drawMultilineText(text, x, y, boxWidth, boxHeight, horizontalAnchor, verticalAnchor, fontSize) -{ - if (!text || text == "") - { - return; - } - - var textBoxX, textBoxY; - var width = boxWidth - (2 * TEXT_PADDING); - - if (horizontalAnchor === "middle") - { - textBoxX = x + (boxWidth / 2); - } - else if (horizontalAnchor === "start") - { - textBoxX = x; - } - - textBoxY = y + (boxHeight / 2); - - var t = paper.text(textBoxX + TEXT_PADDING, textBoxY + TEXT_PADDING).attr({ - "text-anchor" : horizontalAnchor, - "font-family" : "Arial", - "font-size" : fontSize, - "fill" : "#373e48" - }); - - var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - t.attr({ - "text" : abc - }); - var letterWidth = t.getBBox().width / abc.length; - - t.attr({ - "text" : text - }); - var removedLineBreaks = text.split("\n"); - var x = 0, s = []; - for (var r = 0; r < removedLineBreaks.length; r++) - { - var words = removedLineBreaks[r].split(" "); - for ( var i = 0; i < words.length; i++) { - - var l = words[i].length; - if (x + (l * letterWidth) > width) { - s.push("\n"); - x = 0; - } - x += l * letterWidth; - s.push(words[i] + " "); - } - s.push("\n"); - x = 0; - } - t.attr({ - "text" : s.join("") - }); - - if (verticalAnchor && verticalAnchor === "top") - { - t.attr({"y": y + (t.getBBox().height / 2)}); - } -} - -function _drawTextAnnotation(element) -{ - var path1 = paper.path("M20,1 L1,1 L1,50 L20,50"); - path1.attr({ - "stroke": "#585858", - "fill": "none" - }); - - var annotation = paper.set(); - annotation.push(path1); - - annotation.transform("T" + element.x + "," + element.y); - - if (element.text) { - this._drawMultilineText(element.text, element.x + 2, element.y, element.width, element.height, "start", "middle", 11); - } -} - -function _drawFlow(flow){ - - var polyline = new Polyline(flow.id, flow.waypoints, SEQUENCEFLOW_STROKE, paper); - - var strokeColor = _bpmnGetColor(flow, MAIN_STROKE_COLOR); - - polyline.element = paper.path(polyline.path); - polyline.element.attr({"stroke-width":SEQUENCEFLOW_STROKE}); - polyline.element.attr({"stroke":strokeColor}); - - polyline.element.id = flow.id; - - var lastLineIndex = polyline.getLinesCount() - 1; - var line = polyline.getLine(lastLineIndex); - - if (line == undefined) return; - - if (flow.type == "connection" && flow.conditions) - { - var middleX = (line.x1 + line.x2) / 2; - var middleY = (line.y1 + line.y2) / 2; - var image = paper.image("../editor/images/condition-flow.png", middleX - 8, middleY - 8, 16, 16); - } - - var polylineInvisible = new Polyline(flow.id, flow.waypoints, SEQUENCEFLOW_STROKE, paper); - - polylineInvisible.element = paper.path(polyline.path); - polylineInvisible.element.attr({ - "opacity": 0, - "stroke-width": 8, - "stroke" : "#000000" - }); - - if (flow.name) { - var firstLine = polyline.getLine(0); - - var angle; - if (firstLine.x1 !== firstLine.x2) { - angle = Math.atan((firstLine.y2 - firstLine.y1) / (firstLine.x2 - firstLine.x1)); - } else if (firstLine.y1 < firstLine.y2) { - angle = Math.PI / 2; - } else { - angle = -Math.PI / 2; - } - var flowName = paper.text(firstLine.x1, firstLine.y1, flow.name).attr({ - "text-anchor": "middle", - "font-family" : "Arial", - "font-size" : "12", - "fill" : "#000000" - }); - - var offsetX = (flowName.getBBox().width / 2 + 5); - var offsetY = -(flowName.getBBox().height / 2 + 5); - - if (firstLine.x1 > firstLine.x2) { - offsetX = -offsetX; - } - var rotatedOffsetX = offsetX * Math.cos(angle) - offsetY * Math.sin(angle); - var rotatedOffsetY = offsetX * Math.sin(angle) + offsetY * Math.cos(angle); - - flowName.attr({ - x: firstLine.x1 + rotatedOffsetX, - y: firstLine.y1 + rotatedOffsetY - }); - - flowName.transform("r" + ((angle) * 180) / Math.PI); - } - - _showTip(jQuery(polylineInvisible.element.node), flow); - - polylineInvisible.element.mouseover(function() { - paper.getById(polyline.element.id).attr({"stroke":"blue"}); - }); - - polylineInvisible.element.mouseout(function() { - paper.getById(polyline.element.id).attr({"stroke":"#585858"}); - }); - - _drawArrowHead(line); -} - -function _drawAssociation(flow){ - - var polyline = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper); - - polyline.element = paper.path(polyline.path); - polyline.element.attr({"stroke-width": ASSOCIATION_STROKE}); - polyline.element.attr({"stroke-dasharray": ". "}); - polyline.element.attr({"stroke":"#585858"}); - - polyline.element.id = flow.id; - - var polylineInvisible = new Polyline(flow.id, flow.waypoints, ASSOCIATION_STROKE, paper); - - polylineInvisible.element = paper.path(polyline.path); - polylineInvisible.element.attr({ - "opacity": 0, - "stroke-width": 8, - "stroke" : "#000000" - }); - - _showTip(jQuery(polylineInvisible.element.node), flow); - - polylineInvisible.element.mouseover(function() { - paper.getById(polyline.element.id).attr({"stroke":"blue"}); - }); - - polylineInvisible.element.mouseout(function() { - paper.getById(polyline.element.id).attr({"stroke":"#585858"}); - }); -} - -function _drawArrowHead(line, connectionType) -{ - var doubleArrowWidth = 2 * ARROW_WIDTH; - - var arrowHead = paper.path("M0 0L-" + (ARROW_WIDTH / 2 + .5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2 + .5) + " -" + doubleArrowWidth + "z"); - - // anti smoothing - if (this.strokeWidth%2 == 1) - line.x2 += .5, line.y2 += .5; - - arrowHead.transform("t" + line.x2 + "," + line.y2 + ""); - arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); - - arrowHead.attr("fill", "#585858"); - - arrowHead.attr("stroke-width", SEQUENCEFLOW_STROKE); - arrowHead.attr("stroke", "#585858"); - - return arrowHead; -} - -function _determineCustomFillColor(element, defaultColor) { - - var color; - - // By name - if (customActivityColors && customActivityColors[element.name]) { - color = customActivityColors[element.name]; - } - - if (color !== null && color !== undefined) { - return color; - } - - // By id - if (customActivityColors && customActivityColors[element.id]) { - color = customActivityColors[element.id]; - } - - if (color !== null && color !== undefined) { - return color; - } - - return defaultColor; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/bpmn-icons.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/bpmn-icons.js deleted file mode 100644 index 54274102..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/bpmn-icons.js +++ /dev/null @@ -1,395 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -function _drawUserTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#d1b575" - }); - - var userTaskIcon = paper.set(); - userTaskIcon.push(path1); - - userTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawServiceTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M 8,1 7.5,2.875 c 0,0 -0.02438,0.250763 -0.40625,0.4375 C 7.05724,3.330353 7.04387,3.358818 7,3.375 6.6676654,3.4929791 6.3336971,3.6092802 6.03125,3.78125 6.02349,3.78566 6.007733,3.77681 6,3.78125 5.8811373,3.761018 5.8125,3.71875 5.8125,3.71875 l -1.6875,-1 -1.40625,1.4375 0.96875,1.65625 c 0,0 0.065705,0.068637 0.09375,0.1875 0.002,0.00849 -0.00169,0.022138 0,0.03125 C 3.6092802,6.3336971 3.4929791,6.6676654 3.375,7 3.3629836,7.0338489 3.3239228,7.0596246 3.3125,7.09375 3.125763,7.4756184 2.875,7.5 2.875,7.5 L 1,8 l 0,2 1.875,0.5 c 0,0 0.250763,0.02438 0.4375,0.40625 0.017853,0.03651 0.046318,0.04988 0.0625,0.09375 0.1129372,0.318132 0.2124732,0.646641 0.375,0.9375 -0.00302,0.215512 -0.09375,0.34375 -0.09375,0.34375 L 2.6875,13.9375 4.09375,15.34375 5.78125,14.375 c 0,0 0.1229911,-0.09744 0.34375,-0.09375 0.2720511,0.147787 0.5795915,0.23888 0.875,0.34375 0.033849,0.01202 0.059625,0.05108 0.09375,0.0625 C 7.4756199,14.874237 7.5,15.125 7.5,15.125 L 8,17 l 2,0 0.5,-1.875 c 0,0 0.02438,-0.250763 0.40625,-0.4375 0.03651,-0.01785 0.04988,-0.04632 0.09375,-0.0625 0.332335,-0.117979 0.666303,-0.23428 0.96875,-0.40625 0.177303,0.0173 0.28125,0.09375 0.28125,0.09375 l 1.65625,0.96875 1.40625,-1.40625 -0.96875,-1.65625 c 0,0 -0.07645,-0.103947 -0.09375,-0.28125 0.162527,-0.290859 0.262063,-0.619368 0.375,-0.9375 0.01618,-0.04387 0.04465,-0.05724 0.0625,-0.09375 C 14.874237,10.52438 15.125,10.5 15.125,10.5 L 17,10 17,8 15.125,7.5 c 0,0 -0.250763,-0.024382 -0.4375,-0.40625 C 14.669647,7.0572406 14.641181,7.0438697 14.625,7 14.55912,6.8144282 14.520616,6.6141566 14.4375,6.4375 c -0.224363,-0.4866 0,-0.71875 0,-0.71875 L 15.40625,4.0625 14,2.625 l -1.65625,1 c 0,0 -0.253337,0.1695664 -0.71875,-0.03125 l -0.03125,0 C 11.405359,3.5035185 11.198648,3.4455201 11,3.375 10.95613,3.3588185 10.942759,3.3303534 10.90625,3.3125 10.524382,3.125763 10.5,2.875 10.5,2.875 L 10,1 8,1 z m 1,5 c 1.656854,0 3,1.3431458 3,3 0,1.656854 -1.343146,3 -3,3 C 7.3431458,12 6,10.656854 6,9 6,7.3431458 7.3431458,6 9,6 z"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#72a7d0" - }); - - var serviceTaskIcon = paper.set(); - serviceTaskIcon.push(path1); - - serviceTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawScriptTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 5,2 0,0.094 c 0.23706,0.064 0.53189,0.1645 0.8125,0.375 0.5582,0.4186 1.05109,1.228 1.15625,2.5312 l 8.03125,0 1,0 1,0 c 0,-3 -2,-3 -2,-3 l -10,0 z M 4,3 4,13 2,13 c 0,3 2,3 2,3 l 9,0 c 0,0 2,0 2,-3 L 15,6 6,6 6,5.5 C 6,4.1111 5.5595,3.529 5.1875,3.25 4.8155,2.971 4.5,3 4.5,3 L 4,3 z"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#72a7d0" - }); - - var scriptTaskIcon = paper.set(); - scriptTaskIcon.push(path1); - - scriptTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawBusinessRuleTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.45458,5.6000386 2.90906,0 0,2.7999224 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.7999224 -8.72718,0 z m -4.36364,4.1998844 2.90906,0 0,2.800116 -2.90906,0 z m 4.36364,0 8.72718,0 0,2.800116 -8.72718,0 z"); - path1.attr({ - "stroke": "none", - "fill": "#72a7d0" - }); - - var businessRuleTaskIcon = paper.set(); - businessRuleTaskIcon.push(path1); - - businessRuleTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawSendTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z"); - path1.attr({ - "stroke": "none", - "fill": "#16964d" - }); - - var sendTaskIcon = paper.set(); - sendTaskIcon.push(path1); - - sendTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawManualTaskIcon(paper, startX, startY) -{ - var path1 = paper.path("m 17,9.3290326 c -0.0069,0.5512461 -0.455166,1.0455894 -0.940778,1.0376604 l -5.792746,0 c 0.0053,0.119381 0.0026,0.237107 0.0061,0.355965 l 5.154918,0 c 0.482032,-0.0096 0.925529,0.49051 0.919525,1.037574 -0.0078,0.537128 -0.446283,1.017531 -0.919521,1.007683 l -5.245273,0 c -0.01507,0.104484 -0.03389,0.204081 -0.05316,0.301591 l 2.630175,0 c 0.454137,-0.0096 0.872112,0.461754 0.866386,0.977186 C 13.619526,14.554106 13.206293,15.009498 12.75924,15 L 3.7753054,15 C 3.6045812,15 3.433552,14.94423 3.2916363,14.837136 c -0.00174,0 -0.00436,0 -0.00609,0 C 1.7212035,14.367801 0.99998255,11.458641 1,11.458641 L 1,7.4588393 c 0,0 0.6623144,-1.316333 1.8390583,-2.0872584 1.1767614,-0.7711868 6.8053358,-2.40497 7.2587847,-2.8052901 0.453484,-0.40032 1.660213,1.4859942 0.04775,2.4010487 C 8.5332315,5.882394 8.507351,5.7996113 8.4370292,5.7936859 l 6.3569748,-0.00871 c 0.497046,-0.00958 0.952273,0.5097676 0.94612,1.0738232 -0.0053,0.556126 -0.456176,1.0566566 -0.94612,1.0496854 l -4.72435,0 c 0.01307,0.1149374 0.0244,0.2281319 0.03721,0.3498661 l 5.952195,0 c 0.494517,-0.00871 0.947906,0.5066305 0.940795,1.0679848 z"); - path1.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#d1b575" - }); - - var manualTaskIcon = paper.set(); - manualTaskIcon.push(path1); - - manualTaskIcon.transform("T" + startX + "," + startY); -} - -function _drawReceiveTaskIcon(paper, startX, startY) -{ - var path = paper.path("m 0.5,2.5 0,13 17,0 0,-13 z M 2,4 6.5,8.5 2,13 z M 4,4 14,4 9,9 z m 12,0 0,9 -4.5,-4.5 z M 7.5,9.5 9,11 10.5,9.5 15,14 3,14 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#16964d" - }); - - startX += 4; - startY += 2; - - path.transform("T" + startX + "," + startY); - -} - -function _drawCamelTaskIcon(paper, startX, startY) -{ - var path = paper.path("m 8.1878027,15.383782 c -0.824818,-0.3427 0.375093,-1.1925 0.404055,-1.7743 0.230509,-0.8159 -0.217173,-1.5329 -0.550642,-2.2283 -0.106244,-0.5273 -0.03299,-1.8886005 -0.747194,-1.7818005 -0.712355,0.3776 -0.9225,1.2309005 -1.253911,1.9055005 -0.175574,1.0874 -0.630353,2.114 -0.775834,3.2123 -0.244009,0.4224 -1.741203,0.3888 -1.554386,-0.1397 0.651324,-0.3302 1.13227,-0.9222 1.180246,-1.6705 0.0082,-0.7042 -0.133578,-1.3681 0.302178,-2.0083 0.08617,-0.3202 0.356348,-1.0224005 -0.218996,-0.8051 -0.694517,0.2372 -1.651062,0.6128 -2.057645,-0.2959005 -0.696769,0.3057005 -1.102947,-0.611 -1.393127,-1.0565 -0.231079,-0.6218 -0.437041,-1.3041 -0.202103,-1.9476 -0.185217,-0.7514 -0.39751099,-1.5209 -0.35214999,-2.301 -0.243425,-0.7796 0.86000899,-1.2456 0.08581,-1.8855 -0.76078999,0.1964 -1.41630099,-0.7569 -0.79351899,-1.2877 0.58743,-0.52829998 1.49031699,-0.242 2.09856399,-0.77049998 0.816875,-0.3212 1.256619,0.65019998 1.923119,0.71939998 0.01194,0.7333 -0.0031,1.5042 -0.18417,2.2232 -0.194069,0.564 -0.811196,1.6968 0.06669,1.9398 0.738382,-0.173 1.095723,-0.9364 1.659041,-1.3729 0.727298,-0.3962 1.093982,-1.117 1.344137,-1.8675 0.400558,-0.8287 1.697676,-0.6854 1.955367,0.1758 0.103564,0.5511 0.9073983,1.7538 1.2472763,0.6846 0.121868,-0.6687 0.785541,-1.4454 1.518183,-1.0431 0.813587,0.4875 0.658233,1.6033 1.285504,2.2454 0.768715,0.8117 1.745394,1.4801 2.196633,2.5469 0.313781,0.8074 0.568552,1.707 0.496624,2.5733 -0.35485,0.8576005 -1.224508,-0.216 -0.64725,-0.7284 0.01868,-0.3794 -0.01834,-1.3264 -0.370249,-1.3272 -0.123187,0.7586 -0.152778,1.547 -0.10869,2.3154 0.270285,0.6662005 1.310741,0.7653005 1.060553,1.6763005 -0.03493,0.9801 0.294343,1.9505 0.148048,2.9272 -0.320479,0.2406 -0.79575,0.097 -1.185062,0.1512 -0.165725,0.3657 -0.40138,0.921 -1.020848,0.6744 -0.564671,0.1141 -1.246404,-0.266 -0.578559,-0.7715 0.679736,-0.5602 0.898618,-1.5362 0.687058,-2.3673 -0.529674,-1.108 -1.275984,-2.0954005 -1.839206,-3.1831005 -0.634619,-0.1004 -1.251945,0.6779 -1.956789,0.7408 -0.6065893,-0.038 -1.0354363,-0.06 -0.8495673,0.6969005 0.01681,0.711 0.152396,1.3997 0.157345,2.1104 0.07947,0.7464 0.171287,1.4944 0.238271,2.2351 0.237411,1.0076 -0.687542,1.1488 -1.414811,0.8598 z m 6.8675483,-1.8379 c 0.114364,-0.3658 0.206751,-1.2704 -0.114466,-1.3553 -0.152626,0.5835 -0.225018,1.1888 -0.227537,1.7919 0.147087,-0.1166 0.265559,-0.2643 0.342003,-0.4366 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#bd4848" - }); - - startX += 4; - startY += 2; - - path.transform("T" + startX + "," + startY); - -} - -function _drawMuleTaskIcon(paper, startX, startY) -{ - var path = paper.path("M 8,0 C 3.581722,0 0,3.5817 0,8 c 0,4.4183 3.581722,8 8,8 4.418278,0 8,-3.5817 8,-8 L 16,7.6562 C 15.813571,3.3775 12.282847,0 8,0 z M 5.1875,2.7812 8,7.3437 10.8125,2.7812 c 1.323522,0.4299 2.329453,1.5645 2.8125,2.8438 1.136151,2.8609 -0.380702,6.4569 -3.25,7.5937 -0.217837,-0.6102 -0.438416,-1.2022 -0.65625,-1.8125 0.701032,-0.2274 1.313373,-0.6949 1.71875,-1.3125 0.73624,-1.2317 0.939877,-2.6305 -0.03125,-4.3125 l -2.75,4.0625 -0.65625,0 -0.65625,0 -2.75,-4 C 3.5268433,7.6916 3.82626,8.862 4.5625,10.0937 4.967877,10.7113 5.580218,11.1788 6.28125,11.4062 6.063416,12.0165 5.842837,12.6085 5.625,13.2187 2.755702,12.0819 1.238849,8.4858 2.375,5.625 2.858047,4.3457 3.863978,3.2112 5.1875,2.7812 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#bd4848" - }); - - startX += 4; - startY += 2; - - path.transform("T" + startX + "," + startY); - -} - -function _drawAlfrescoPublishTaskIcon(paper, startX, startY) -{ - - startX += 2; - startY += 2; - - var path = paper.path("M4.11870968,2.12890323 L6.12954839,0.117935484 L3.10993548,0.118064516 L3.10270968,0.118064516 C1.42941935,0.118064516 0.0729032258,1.47458065 0.0729032258,3.14774194 C0.0729032258,4.82116129 1.42929032,6.17754839 3.10258065,6.17754839 C3.22967742,6.17754839 3.35470968,6.16877419 3.47767742,6.15354839 C2.8163871,4.85083871 3.02954839,3.21793548 4.11870968,2.12890323M6.57032258,3.144 L6.57032258,0.300258065 L4.43522581,2.4356129 L4.43006452,2.44064516 C3.24683871,3.62387097 3.24683871,5.54219355 4.43006452,6.72541935 C5.61329032,7.90864516 7.5316129,7.90864516 8.71483871,6.72541935 C8.80464516,6.6356129 8.88529032,6.54025806 8.96154839,6.44270968 C7.57341935,5.98864516 6.57045161,4.68387097 6.57032258,3.144"); - path.attr({"fill": "#87C040"}); - - var startX1 = startX + 1.419355; - var startY1 = startY + 8.387097; - path.transform("T" + startX1 + "," + startY1); - - path = paper.path("M10.4411613,10.5153548 L8.43032258,8.50451613 L8.43032258,11.5313548 C8.43032258,13.2047742 9.78683871,14.5611613 11.460129,14.5611613 C13.1334194,14.5611613 14.4899355,13.2047742 14.4899355,11.5314839 C14.4899355,11.4043871 14.4811613,11.2793548 14.4659355,11.1563871 C13.1632258,11.8178065 11.5303226,11.6045161 10.4411613,10.5153548M15.0376774,5.91935484 C14.947871,5.82954839 14.8526452,5.74890323 14.7550968,5.67264516 C14.3010323,7.06064516 12.996129,8.06374194 11.4563871,8.06374194 L8.61277419,8.06374194 L10.7529032,10.204 C11.936129,11.3872258 13.8545806,11.3872258 15.0376774,10.204 C16.2209032,9.02077419 16.2209032,7.10245161 15.0376774,5.91935484"); - path.attr({"fill": "#87C040"}); - path.transform("T" + startX + "," + startY); - - path = paper.path("M5.9083871,1.5636129 C5.78129032,1.5636129 5.65625806,1.57225806 5.53329032,1.58748387 C6.19458065,2.89032258 5.98141935,4.52309677 4.89225806,5.61225806 L2.88154839,7.62309677 L5.9083871,7.62309677 C7.58154839,7.62309677 8.93806452,6.26658065 8.93806452,4.59329032 C8.93819355,2.92 7.58167742,1.5636129 5.9083871,1.5636129"); - path.attr({"fill": "#ED9A2D"}); - var startX2 = startX + 5.548387; - path.transform("T" + startX2 + "," + startY); - path = paper.path("M4.58090323,1.0156129 C3.39767742,-0.167483871 1.47935484,-0.167483871 0.296129032,1.01574194 C0.206451613,1.10554839 0.125806452,1.20077419 0.0495483871,1.29845161 C1.43754839,1.75251613 2.44064516,3.05729032 2.44064516,4.59703226 L2.44064516,7.44077419 L4.57574194,5.30554839 L4.58090323,5.30051613 C5.76412903,4.11729032 5.76412903,2.19896774 4.58090323,1.0156129"); - path.attr({"fill": "#5698C6"}); - path.transform("T" + startX2 + "," + startY); - - path = paper.path("M5.54051613,5.61432258 L5.62670968,5.70425806 L7.54632258,7.62387097 L7.5483871,7.62387097 L7.5483871,4.604 L7.5483871,4.59677419 C7.5483871,2.92348387 6.19187097,1.56696774 4.51858065,1.56696774 C2.84529032,1.56696774 1.48877419,2.92335484 1.48890323,4.59664516 C1.48890323,4.72348387 1.49754839,4.84812903 1.51264516,4.97083871 C2.81625806,4.30993548 4.45122581,4.52503226 5.54051613,5.61432258M1.23251613,10.4292903 C1.25625806,10.3588387 1.28180645,10.2894194 1.30980645,10.2210323 C1.31329032,10.2123871 1.3163871,10.2036129 1.32,10.1952258 C1.35070968,10.1216774 1.38451613,10.0500645 1.42,9.97935484 C1.42774194,9.96374194 1.43574194,9.9483871 1.44387097,9.93277419 C1.4803871,9.86258065 1.51883871,9.79354839 1.55987097,9.72632258 C1.56425806,9.71909677 1.56903226,9.71225806 1.57341935,9.70529032 C1.6123871,9.64245161 1.65354839,9.58141935 1.6963871,9.52141935 C1.70516129,9.50903226 1.71380645,9.49651613 1.72283871,9.48425806 C1.76890323,9.42154839 1.81690323,9.36064516 1.86683871,9.30129032 C1.87703226,9.28916129 1.88735484,9.27741935 1.89780645,9.26567742 C1.94658065,9.20916129 1.99690323,9.15406452 2.04916129,9.10090323 C2.05380645,9.09625806 2.05806452,9.09135484 2.06270968,9.08670968 C2.11832258,9.03083871 2.17625806,8.97741935 2.23548387,8.92554839 C2.2483871,8.91419355 2.26129032,8.90296774 2.27432258,8.89187097 C2.33393548,8.84103226 2.39496774,8.79212903 2.45780645,8.74529032 C2.46606452,8.73922581 2.47470968,8.73354839 2.48296774,8.7276129 C2.54167742,8.68490323 2.60180645,8.64412903 2.66322581,8.60503226 C2.67535484,8.59729032 2.68735484,8.58929032 2.6996129,8.58167742 C2.76593548,8.54064516 2.83380645,8.50206452 2.90296774,8.46541935 C2.91754839,8.45780645 2.93225806,8.45045161 2.94696774,8.44296774 C3.016,8.40774194 3.08593548,8.37406452 3.15741935,8.34348387 C3.16090323,8.34206452 3.16425806,8.3403871 3.16774194,8.33883871 C3.24167742,8.30748387 3.31729032,8.27948387 3.39380645,8.25316129 C3.41032258,8.24748387 3.42670968,8.24180645 3.44335484,8.2363871 C3.51909677,8.21174194 3.59587097,8.18903226 3.67380645,8.16929032 C3.68567742,8.16645161 3.69793548,8.16387097 3.70980645,8.16116129 C3.78206452,8.14374194 3.85509677,8.12877419 3.92890323,8.116 C3.94270968,8.11367742 3.9563871,8.11083871 3.97019355,8.10877419 C4.05032258,8.09587097 4.13148387,8.08619355 4.21329032,8.07896774 C4.23096774,8.07741935 4.24877419,8.07625806 4.26645161,8.07483871 C4.35109677,8.06877419 4.43612903,8.06451613 4.52232258,8.06451613 L7.36606452,8.0643871 L5.22580645,5.92412903 C4.04258065,4.74103226 2.12412903,4.74090323 0.941032258,5.92412903 C-0.242193548,7.10735484 -0.242193548,9.02567742 0.941032258,10.2089032 C1.03070968,10.2985806 1.12464516,10.3814194 1.22206452,10.4575484 C1.22529032,10.448 1.22929032,10.4388387 1.23251613,10.4292903"); - path.attr({"fill": "#5698C6"}); - path.transform("T" + startX + "," + startY); - - path = paper.path("M5.23290323,5.92412903 L6.92748387,7.61870968 L4.64980645,7.61870968 L4.52064516,7.62141935 C3.13354839,7.62141935 1.96425806,6.68929032 1.60477419,5.41729032 C2.75870968,4.77019355 4.24619355,4.93754839 5.22787097,5.91909677 L5.23290323,5.92412903M7.54722581,4.59612903 L7.54722581,6.99264516 L5.93664516,5.38206452 L5.84348387,5.29264516 C4.86258065,4.31187097 4.69483871,2.82580645 5.34012903,1.67225806 C6.61367742,2.03070968 7.54722581,3.20090323 7.54722581,4.58890323 L7.54722581,4.59612903M10.1385806,5.29819355 L8.444,6.99290323 L8.444,4.71522581 L8.44129032,4.58606452 C8.44129032,3.19896774 9.37341935,2.02954839 10.6454194,1.67019355 C11.2925161,2.82412903 11.1251613,4.3116129 10.1436129,5.29316129 L10.1385806,5.29819355"); - path.attr({"fill": "#446BA5"}); - path.transform("T" + startX + "," + startY); - - path = paper.path("M11.4548387,7.61677419 L9.05832258,7.61677419 L10.6689032,6.00619355 L10.7583226,5.91303226 C11.7390968,4.93212903 13.2251613,4.7643871 14.3787097,5.40967742 C14.0202581,6.68322581 12.8500645,7.61677419 11.4620645,7.61677419 L11.4548387,7.61677419"); - path.attr({"fill": "#FFF101"}); - path.transform("T" + startX + "," + startY); - - path = paper.path("M10.7470968,10.192 L9.05251613,8.49741935 L11.3301935,8.49741935 L11.4593548,8.49470968 C12.8464516,8.49483871 14.0157419,9.42696774 14.3752258,10.6989677 C13.2211613,11.3459355 11.7338065,11.1787097 10.752129,10.1970323 L10.7470968,10.192M8.43729032,11.5174194 L8.43729032,9.12090323 L10.047871,10.7314839 L10.1411613,10.8209032 C11.1219355,11.8018065 11.2896774,13.2876129 10.6443871,14.4412903 C9.37083871,14.0828387 8.43729032,12.9127742 8.43729032,11.5245161 L8.43729032,11.5174194M5.86193548,10.8296774 L7.55651613,9.13496774 L7.55651613,11.4126452 L7.55922581,11.5418065 C7.55922581,12.9289032 6.62709677,14.0983226 5.35509677,14.4578065 C4.708,13.3036129 4.87535484,11.8162581 5.85690323,10.8347097 L5.86193548,10.8296774M4.53251613,8.50993548 L6.92903226,8.50993548 L5.31845161,10.1205161 L5.22903226,10.2136774 C4.24812903,11.1945806 2.76219355,11.3623226 1.60851613,10.7170323 C1.96709677,9.44335484 3.13716129,8.50993548 4.52529032,8.50993548 L4.53251613,8.50993548"); - path.attr({"fill": "#45AB47"}); - path.transform("T" + startX + "," + startY); -} - -function _drawHttpTaskIcon(paper, startX, startY) -{ - var path = paper.path("m 16.704699,5.9229055 q 0.358098,0 0.608767,0.2506681 0.250669,0.250668 0.250669,0.6087677 0,0.3580997 -0.250669,0.6087677 -0.250669,0.2506679 -0.608767,0.2506679 -0.358098,0 -0.608767,-0.2506679 -0.250669,-0.250668 -0.250669,-0.6087677 0,-0.3580997 0.250669,-0.6087677 0.250669,-0.2506681 0.608767,-0.2506681 z m 2.578308,-2.0053502 q -2.229162,0 -3.854034,0.6759125 -1.624871,0.6759067 -3.227361,2.2694472 -0.716197,0.725146 -1.575633,1.7457293 L 7.2329969,8.7876913 Q 7.0897576,8.8055849 7.000233,8.9309334 L 4.9948821,12.368677 q -0.035811,0.06267 -0.035811,0.143242 0,0.107426 0.080572,0.205905 l 0.5729577,0.572957 q 0.125334,0.116384 0.2864786,0.07162 l 2.4708789,-0.760963 2.5156417,2.515645 -0.76096,2.470876 q -0.009,0.02687 -0.009,0.08057 0,0.125338 0.08058,0.205905 l 0.572957,0.572958 q 0.170096,0.152194 0.349146,0.04476 l 3.437744,-2.005351 q 0.125335,-0.08953 0.143239,-0.232763 l 0.17905,-3.392986 q 1.02058,-0.859435 1.745729,-1.575629 1.67411,-1.6830612 2.309735,-3.2049805 0.635625,-1.5219191 0.635625,-3.8585111 0,-0.1253369 -0.08505,-0.2148575 -0.08505,-0.089526 -0.201431,-0.089526 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#16964d" - }); - - startX += -2; - startY += -2; - - path.transform("T" + startX + "," + startY); - -} - -function _drawShellTaskIcon(paper, startX, startY) { - var path = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.4,3 12.7,0 0,10 -12.7,0 z"); - path.attr({ - "opacity": 1, - "stroke": "none", - "fill": "#16964d" - }); - var text = paper.text(3, 9, ">_").attr({ - "font-size": "5px", - "fill": "#16964d" - }); - - startY += -2; - text.transform("T" + startX + "," + startY); - startX += -2; - path.transform("T" + startX + "," + startY); -} - -function _drawDecisionTaskIcon(paper, startX, startY) { - var path1 = paper.path("m 1,2 0,14 16,0 0,-14 z m 1.9,2.4000386 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m -8.67364,3.9 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z m 4.36364,0 3.7,0 0,2.7999224 -3.7,0 z"); - path1.attr({ - "opacity": 1, - "stroke": "#000000", - "fill": "#F4F6F7" - }); - - var decisionTaskIcon = paper.set(); - decisionTaskIcon.push(path1); - - decisionTaskIcon.translate(startX, startY); - decisionTaskIcon.scale(0.7, 0.7); -} - -function _drawEventIcon(paper, element) -{ - if (element.eventDefinition && element.eventDefinition.type) { - if ("timer" === element.eventDefinition.type) { - _drawTimerIcon(paper, element); - - } else if ("conditional" === element.eventDefinition.type) { - _drawConditionalIcon(paper, element); - - } else if ("error" === element.eventDefinition.type) { - _drawErrorIcon(paper, element); - - } else if ("escalation" === element.eventDefinition.type) { - _drawEscalationIcon(paper, element); - - } else if ("signal" === element.eventDefinition.type) { - _drawSignalIcon(paper, element); - - } else if ("message" === element.eventDefinition.type) { - _drawMessageIcon(paper, element); - - } else if ("eventRegistry" === element.eventDefinition.type) { - _drawMessageIcon(paper, element); - - } else if ("variable" === element.eventDefinition.type) { - _drawVariableListenerIcon(paper, element); - } - } -} - -function _drawConditionalIcon(paper, element) -{ - var fill = "none"; - - var path = paper.path("M 10 10 L 22 10 M 10 14 L 22 14 M 10 18 L 22 18 M 10 22 L 22 22"); - path.attr({ - "stroke": "black", - "stroke-width": 1, - "fill": fill - }); - path.transform("T" + (element.x - 1) + "," + (element.y - 1)); - return path; -} - -function _drawVariableListenerIcon(paper, element) -{ - var fill = "none"; - - var path = paper.path("M 20.834856,22.874369 L 10.762008,22.873529 L 7.650126,13.293421 L 15.799725,7.3734296 L 23.948336,13.294781 L 20.834856,22.874369 z"); - path.attr({ - "stroke": "black", - "stroke-width": 1, - "fill": fill - }); - path.transform("T" + (element.x - 1) + "," + (element.y - 1)); - return path; -} - -function _drawTimerIcon(paper, element) -{ - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - - var circle = paper.circle(x, y, 10); - - circle.attr({"stroke-width": 1, - "stroke": "black", - "fill": "none" - }); - - var path = paper.path("M 10 0 C 4.4771525 0 0 4.4771525 0 10 C 0 15.522847 4.4771525 20 10 20 C 15.522847 20 20 15.522847 20 10 C 20 4.4771525 15.522847 1.1842379e-15 10 0 z M 9.09375 1.03125 C 9.2292164 1.0174926 9.362825 1.0389311 9.5 1.03125 L 9.5 3.5 L 10.5 3.5 L 10.5 1.03125 C 15.063526 1.2867831 18.713217 4.9364738 18.96875 9.5 L 16.5 9.5 L 16.5 10.5 L 18.96875 10.5 C 18.713217 15.063526 15.063526 18.713217 10.5 18.96875 L 10.5 16.5 L 9.5 16.5 L 9.5 18.96875 C 4.9364738 18.713217 1.2867831 15.063526 1.03125 10.5 L 3.5 10.5 L 3.5 9.5 L 1.03125 9.5 C 1.279102 5.0736488 4.7225326 1.4751713 9.09375 1.03125 z M 9.5 5 L 9.5 8.0625 C 8.6373007 8.2844627 8 9.0680195 8 10 C 8 11.104569 8.8954305 12 10 12 C 10.931981 12 11.715537 11.362699 11.9375 10.5 L 14 10.5 L 14 9.5 L 11.9375 9.5 C 11.756642 8.7970599 11.20294 8.2433585 10.5 8.0625 L 10.5 5 L 9.5 5 z"); - path.attr({ - "stroke": "none", - "fill": "#585858" - }); - path.transform("T" + (element.x + 5) + "," + (element.y + 5)); - return path; -} - -function _drawErrorIcon(paper, element) -{ - var path = paper.path("M 22.820839,11.171502 L 19.36734,24.58992 L 13.54138,14.281819 L 9.3386512,20.071607 L 13.048949,6.8323057 L 18.996148,16.132659 L 22.820839,11.171502 z"); - - var fill = "none"; - var x = element.x - 1; - var y = element.y - 1; - if (element.type === "EndEvent") - { - fill = "black"; - x -= 1; - y -= 1; - } - - path.attr({ - "stroke": "black", - "stroke-width": 1, - "fill": fill - }); - - path.transform("T" + x + "," + y); - return path; -} - -function _drawEscalationIcon(paper, element) -{ - var fill = "none"; - if (element.type === "ThrowEvent") - { - fill = "black"; - } - - var path = paper.path("M 16,8.75 L22,23.75 L16,17 L10,23.75z"); - path.attr({ - "stroke": "black", - "stroke-width": 1, - "fill": fill - }); - path.transform("T" + (element.x - 1) + "," + (element.y - 1)); - return path; -} - -function _drawSignalIcon(paper, element) -{ - var fill = "none"; - if (element.type === "ThrowEvent") - { - fill = "black"; - } - - var path = paper.path("M 8.7124971,21.247342 L 23.333334,21.247342 L 16.022915,8.5759512 L 8.7124971,21.247342 z"); - path.attr({ - "stroke": "black", - "stroke-width": 1, - "fill": fill - }); - path.transform("T" + (element.x - 1) + "," + (element.y - 1)); - return path; -} - -function _drawMessageIcon(paper, element) -{ - var fill = "none"; - if (element.type === "ThrowEvent") - { - fill = "black"; - } - - var path = paper.path("M 1 3 L 9 11 L 17 3 L 1 3 z M 1 5 L 1 13 L 5 9 L 1 5 z M 17 5 L 13 9 L 17 13 L 17 5 z M 6 10 L 1 15 L 17 15 L 12 10 L 9 13 L 6 10 z"); - path.attr({ - "stroke": "black", - "stroke-width": 1, - "fill": fill - }); - path.transform("T" + (element.x + 6) + "," + (element.y + 6)); - return path; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.css b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.css deleted file mode 100644 index 272b2585..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.css +++ /dev/null @@ -1,24 +0,0 @@ -div[class*='ui-tooltip-kisbpm-'] { - background-color: #ffffff; - border-color: #c5c5c5; - color: #4a4a4a; - font-family: Verdana; - font-size: 12px; -} - -div[class*='ui-tooltip-kisbpm-'] .qtip-content { - color: #4a4a4a; - background-color: #ffffff; - font-family: Verdana; - font-size: 12px; -} - -.ui-tooltip-kisbpm-bpmn .qtip-titlebar { - color: #FFFFFF; - font-size: 12px; - background: #2B414F; -} - -.ui-tooltip-kisbpm-bpmn .qtip-tip { - background-color: #2B414F; -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.html deleted file mode 100644 index a6d5a9e8..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.js deleted file mode 100644 index 2826cb7a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/displaymodel.js +++ /dev/null @@ -1,316 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var NORMAL_STROKE = 1; -var SEQUENCEFLOW_STROKE = 1.5; -var ASSOCIATION_STROKE = 2; -var TASK_STROKE = 1; -var TASK_HIGHLIGHT_STROKE = 2; -var CALL_ACTIVITY_STROKE = 2; -var ENDEVENT_STROKE = 3; - -var COMPLETED_COLOR= "#2632aa"; -var TEXT_COLOR= "#373e48"; -var CURRENT_COLOR= "#017501"; -var HOVER_COLOR= "#666666"; -var ACTIVITY_STROKE_COLOR = "#bbbbbb"; -var ACTIVITY_FILL_COLOR = "#f9f9f9"; -var MAIN_STROKE_COLOR = "#585858"; - -var TEXT_PADDING = 3; -var ARROW_WIDTH = 4; -var MARKER_WIDTH = 12; - -var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Raphael.rgb(0, 0, 0)}; - -// icons -var ICON_SIZE = 16; -var ICON_PADDING = 4; - -var INITIAL_CANVAS_WIDTH; -var INITIAL_CANVAS_HEIGHT; - -var paper; -var viewBox; -var viewBoxWidth; -var viewBoxHeight; - -var canvasWidth; -var canvasHeight; - -var modelDiv = jQuery('#bpmnModel'); -var modelId = modelDiv.attr('data-model-id'); -var historyModelId = modelDiv.attr('data-history-id'); -var processDefinitionId = modelDiv.attr('data-process-definition-id'); -var modelType = modelDiv.attr('data-model-type'); - -// Support for custom background colors for activities -var customActivityColors = modelDiv.attr('data-activity-color-mapping'); -if (customActivityColors !== null && customActivityColors !== undefined && customActivityColors.length > 0) { - // Stored on the attribute as a string - customActivityColors = JSON.parse(customActivityColors); -} - -var customActivityToolTips = modelDiv.attr('data-activity-tooltips'); -if (customActivityToolTips !== null && customActivityToolTips !== undefined && customActivityToolTips.length > 0) { - // Stored on the attribute as a string - customActivityToolTips = JSON.parse(customActivityToolTips); -} - -// Support for custom opacity for activity backgrounds -var customActivityBackgroundOpacity = modelDiv.attr('data-activity-opacity'); - -var elementsAdded = new Array(); -var elementsRemoved = new Array(); - -function _showTip(htmlNode, element) -{ - - // Custom tooltip - var documentation = undefined; - if (customActivityToolTips) { - if (customActivityToolTips[element.name]) { - documentation = customActivityToolTips[element.name]; - } else if (customActivityToolTips[element.id]) { - documentation = customActivityToolTips[element.id]; - } else { - documentation = ''; // Show nothing if custom tool tips are enabled - } - } - - // Default tooltip, no custom tool tip set - if (documentation === undefined) { - var documentation = ""; - if (element.name && element.name.length > 0) { - documentation += "Name: " + element.name + "

"; - } - - if (element.properties) { - for (var i = 0; i < element.properties.length; i++) { - var propName = element.properties[i].name; - if (element.properties[i].type && element.properties[i].type === 'list') { - documentation += '' + propName + ':
'; - for (var j = 0; j < element.properties[i].value.length; j++) { - documentation += '' + element.properties[i].value[j] + '
'; - } - } - else { - documentation += '' + propName + ': ' + element.properties[i].value + '
'; - } - } - } - } - - var text = element.type + " "; - if (element.name && element.name.length > 0) - { - text += element.name; - } - else - { - text += element.id; - } - - htmlNode.qtip({ - content: { - text: documentation, - title: { - text: text - } - }, - position: { - my: 'top left', - at: 'bottom center', - viewport: jQuery('#bpmnModel') - }, - hide: { - fixed: true, delay: 500, - event: 'click mouseleave' - }, - style: { - classes: 'ui-tooltip-kisbpm-bpmn' - } - }); -} - -function _addHoverLogic(element, type, defaultColor) -{ - var strokeColor = _bpmnGetColor(element, defaultColor); - var topBodyRect = null; - if (type === "rect") - { - topBodyRect = paper.rect(element.x, element.y, element.width, element.height); - } - else if (type === "circle") - { - var x = element.x + (element.width / 2); - var y = element.y + (element.height / 2); - topBodyRect = paper.circle(x, y, 15); - } - else if (type === "rhombus") - { - topBodyRect = paper.path("M" + element.x + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + (element.y + element.height) + - "L" + (element.x + element.width) + " " + (element.y + (element.height / 2)) + - "L" + (element.x + (element.width / 2)) + " " + element.y + "z" - ); - } - - var opacity = 0; - var fillColor = "#ffffff"; - if (jQuery.inArray(element.id, elementsAdded) >= 0) - { - opacity = 0.2; - fillColor = "green"; - } - - if (jQuery.inArray(element.id, elementsRemoved) >= 0) - { - opacity = 0.2; - fillColor = "red"; - } - - topBodyRect.attr({ - "opacity": opacity, - "stroke" : "none", - "fill" : fillColor - }); - _showTip(jQuery(topBodyRect.node), element); - - topBodyRect.mouseover(function() { - paper.getById(element.id).attr({"stroke":HOVER_COLOR}); - }); - - topBodyRect.mouseout(function() { - paper.getById(element.id).attr({"stroke":strokeColor}); - }); -} - -function _zoom(zoomIn) -{ - var tmpCanvasWidth, tmpCanvasHeight; - if (zoomIn) - { - tmpCanvasWidth = canvasWidth * (1.0/0.90); - tmpCanvasHeight = canvasHeight * (1.0/0.90); - } - else - { - tmpCanvasWidth = canvasWidth * (1.0/1.10); - tmpCanvasHeight = canvasHeight * (1.0/1.10); - } - - if (tmpCanvasWidth != canvasWidth || tmpCanvasHeight != canvasHeight) - { - canvasWidth = tmpCanvasWidth; - canvasHeight = tmpCanvasHeight; - paper.setSize(canvasWidth, canvasHeight); - } -} - -var modelUrl; -if (modelType == 'runtime') { - if (historyModelId) { - modelUrl = FLOWABLE.APP_URL.getProcessInstanceModelJsonHistoryUrl(historyModelId); - } else { - modelUrl = FLOWABLE.APP_URL.getProcessInstanceModelJsonUrl(modelId); - } -} else if (modelType == 'design') { - if (historyModelId) { - modelUrl = FLOWABLE.APP_URL.getModelHistoryModelJsonUrl(modelId, historyModelId); - } else { - modelUrl = FLOWABLE.APP_URL.getModelModelJsonUrl(modelId); - } -} else if (modelType == 'process-definition') { - modelUrl = FLOWABLE.APP_URL.getProcessDefinitionModelJsonUrl(processDefinitionId); -} - -var request = jQuery.ajax({ - type: 'get', - url: modelUrl + '?nocaching=' + new Date().getTime() -}); - -request.success(function(data, textStatus, jqXHR) { - - if ((!data.elements || data.elements.length == 0) && (!data.pools || data.pools.length == 0)) return; - - INITIAL_CANVAS_WIDTH = data.diagramWidth; - - if (modelType == 'design') { - INITIAL_CANVAS_WIDTH += 20; - } else { - INITIAL_CANVAS_WIDTH += 30; - } - - INITIAL_CANVAS_HEIGHT = data.diagramHeight + 50; - canvasWidth = INITIAL_CANVAS_WIDTH; - canvasHeight = INITIAL_CANVAS_HEIGHT; - viewBoxWidth = INITIAL_CANVAS_WIDTH; - viewBoxHeight = INITIAL_CANVAS_HEIGHT; - - if (modelType == 'design') { - var headerBarHeight = 170; - var offsetY = 0; - if (jQuery(window).height() > (canvasHeight + headerBarHeight)) - { - offsetY = (jQuery(window).height() - headerBarHeight - canvasHeight) / 2; - } - - if (offsetY > 50) { - offsetY = 50; - } - - jQuery('#bpmnModel').css('marginTop', offsetY); - } - - jQuery('#bpmnModel').width(INITIAL_CANVAS_WIDTH); - jQuery('#bpmnModel').height(INITIAL_CANVAS_HEIGHT); - paper = Raphael(document.getElementById('bpmnModel'), canvasWidth, canvasHeight); - paper.setViewBox(0, 0, viewBoxWidth, viewBoxHeight, false); - paper.renderfix(); - - if (data.pools) - { - for (var i = 0; i < data.pools.length; i++) - { - var pool = data.pools[i]; - _drawPool(pool); - } - } - - var modelElements = data.elements; - for (var i = 0; i < modelElements.length; i++) - { - var element = modelElements[i]; - //try { - var drawFunction = eval("_draw" + element.type); - drawFunction(element); - //} catch(err) {console.log(err);} - } - - if (data.flows) - { - for (var i = 0; i < data.flows.length; i++) - { - var flow = data.flows[i]; - if (flow.type === 'sequenceFlow') { - _drawFlow(flow); - } else if (flow.type === 'association') { - _drawAssociation(flow); - } - } - } -}); - -request.error(function(jqXHR, textStatus, errorThrown) { - alert("error"); -}); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/jquery.qtip.min.css b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/jquery.qtip.min.css deleted file mode 100644 index aef428dc..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/jquery.qtip.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* qTip2 v2.2.0 basic css3 | qtip2.com | Licensed MIT, GPL | Wed Dec 18 2013 05:02:24 */ -.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr;box-shadow:none;padding:0}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;cursor:pointer;outline:medium none;border-width:1px;border-style:solid;border-color:transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-titlebar .ui-icon,.qtip-icon .ui-icon{display:block;text-indent:-1000em;direction:ltr}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;line-height:14px;text-align:center;text-indent:0;font:400 bold 10px/13px Tahoma,sans-serif;color:inherit;background:transparent none no-repeat -100em -100em}.qtip-focus{}.qtip-hover{}.qtip-default{border-width:1px;border-style:solid;border-color:#F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111} .qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1} .qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030} .qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0} .qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon{border-color:#D95252}.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252} .qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0} .qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-rounded,.qtip-tipsy,.qtip-bootstrap{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-rounded .qtip-titlebar{-moz-border-radius:4px 4px 0 0;-webkit-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border-width:0;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,#000));background-image:-webkit-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,#000 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,#000 100%)}.qtip-youtube .qtip-titlebar{background-color:#4A4A4A;background-color:rgba(0,0,0,0)}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323)"}.qtip-jtools .qtip-titlebar,.qtip-jtools .qtip-content{background:transparent;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px #000}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10px;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10px}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:transparent}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}x:-o-prefocus,.qtip .qtip-tip{visibility:hidden}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml,.qtip .qtip-tip canvas{position:absolute;color:#123456;background:transparent;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:0;top:0;width:100%;height:100%}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"} \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/jquery.qtip.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/jquery.qtip.min.js deleted file mode 100644 index 25bf4243..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/jquery.qtip.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/* qTip2 v2.2.0 tips viewport svg modal | qtip2.com | Licensed MIT, GPL | Wed Dec 18 2013 05:02:22 */ - -!function(a,b,c){!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.qtip&&a(jQuery)}(function(d){"use strict";function e(a,b,c,e){this.id=c,this.target=a,this.tooltip=F,this.elements={target:a},this._id=S+"-"+c,this.timers={img:{}},this.options=b,this.plugins={},this.cache={event:{},target:d(),disabled:E,attr:e,onTooltip:E,lastClass:""},this.rendered=this.destroyed=this.disabled=this.waiting=this.hiddenDuringWait=this.positioning=this.triggering=E}function f(a){return a===F||"object"!==d.type(a)}function g(a){return!(d.isFunction(a)||a&&a.attr||a.length||"object"===d.type(a)&&(a.jquery||a.then))}function h(a){var b,c,e,h;return f(a)?E:(f(a.metadata)&&(a.metadata={type:a.metadata}),"content"in a&&(b=a.content,f(b)||b.jquery||b.done?b=a.content={text:c=g(b)?E:b}:c=b.text,"ajax"in b&&(e=b.ajax,h=e&&e.once!==E,delete b.ajax,b.text=function(a,b){var f=c||d(this).attr(b.options.content.attr)||"Loading...",g=d.ajax(d.extend({},e,{context:b})).then(e.success,F,e.error).then(function(a){return a&&h&&b.set("content.text",a),a},function(a,c,d){b.destroyed||0===a.status||b.set("content.text",c+": "+d)});return h?f:(b.set("content.text",f),g)}),"title"in b&&(f(b.title)||(b.button=b.title.button,b.title=b.title.text),g(b.title||E)&&(b.title=E))),"position"in a&&f(a.position)&&(a.position={my:a.position,at:a.position}),"show"in a&&f(a.show)&&(a.show=a.show.jquery?{target:a.show}:a.show===D?{ready:D}:{event:a.show}),"hide"in a&&f(a.hide)&&(a.hide=a.hide.jquery?{target:a.hide}:{event:a.hide}),"style"in a&&f(a.style)&&(a.style={classes:a.style}),d.each(R,function(){this.sanitize&&this.sanitize(a)}),a)}function i(a,b){for(var c,d=0,e=a,f=b.split(".");e=e[f[d++]];)d0?setTimeout(d.proxy(a,this),b):(a.call(this),void 0)}function n(a){return this.tooltip.hasClass(ab)?E:(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this.timers.show=m.call(this,function(){this.toggle(D,a)},this.options.show.delay),void 0)}function o(a){if(this.tooltip.hasClass(ab))return E;var b=d(a.relatedTarget),c=b.closest(W)[0]===this.tooltip[0],e=b[0]===this.options.show.target[0];if(clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this!==b[0]&&"mouse"===this.options.position.target&&c||this.options.hide.fixed&&/mouse(out|leave|move)/.test(a.type)&&(c||e))try{a.preventDefault(),a.stopImmediatePropagation()}catch(f){}else this.timers.hide=m.call(this,function(){this.toggle(E,a)},this.options.hide.delay,this)}function p(a){return this.tooltip.hasClass(ab)||!this.options.hide.inactive?E:(clearTimeout(this.timers.inactive),this.timers.inactive=m.call(this,function(){this.hide(a)},this.options.hide.inactive),void 0)}function q(a){this.rendered&&this.tooltip[0].offsetWidth>0&&this.reposition(a)}function r(a,c,e){d(b.body).delegate(a,(c.split?c:c.join(hb+" "))+hb,function(){var a=y.api[d.attr(this,U)];a&&!a.disabled&&e.apply(a,arguments)})}function s(a,c,f){var g,i,j,k,l,m=d(b.body),n=a[0]===b?m:a,o=a.metadata?a.metadata(f.metadata):F,p="html5"===f.metadata.type&&o?o[f.metadata.name]:F,q=a.data(f.metadata.name||"qtipopts");try{q="string"==typeof q?d.parseJSON(q):q}catch(r){}if(k=d.extend(D,{},y.defaults,f,"object"==typeof q?h(q):F,h(p||o)),i=k.position,k.id=c,"boolean"==typeof k.content.text){if(j=a.attr(k.content.attr),k.content.attr===E||!j)return E;k.content.text=j}if(i.container.length||(i.container=m),i.target===E&&(i.target=n),k.show.target===E&&(k.show.target=n),k.show.solo===D&&(k.show.solo=i.container.closest("body")),k.hide.target===E&&(k.hide.target=n),k.position.viewport===D&&(k.position.viewport=i.container),i.container=i.container.eq(0),i.at=new A(i.at,D),i.my=new A(i.my),a.data(S))if(k.overwrite)a.qtip("destroy",!0);else if(k.overwrite===E)return E;return a.attr(T,c),k.suppress&&(l=a.attr("title"))&&a.removeAttr("title").attr(cb,l).attr("title",""),g=new e(a,k,c,!!j),a.data(S,g),a.one("remove.qtip-"+c+" removeqtip.qtip-"+c,function(){var a;(a=d(this).data(S))&&a.destroy(!0)}),g}function t(a){return a.charAt(0).toUpperCase()+a.slice(1)}function u(a,b){var d,e,f=b.charAt(0).toUpperCase()+b.slice(1),g=(b+" "+sb.join(f+" ")+f).split(" "),h=0;if(rb[b])return a.css(rb[b]);for(;d=g[h++];)if((e=a.css(d))!==c)return rb[b]=d,e}function v(a,b){return Math.ceil(parseFloat(u(a,b)))}function w(a,b){this._ns="tip",this.options=b,this.offset=b.offset,this.size=[b.width,b.height],this.init(this.qtip=a)}function x(a,b){this.options=b,this._ns="-modal",this.init(this.qtip=a)}var y,z,A,B,C,D=!0,E=!1,F=null,G="x",H="y",I="width",J="height",K="top",L="left",M="bottom",N="right",O="center",P="flipinvert",Q="shift",R={},S="qtip",T="data-hasqtip",U="data-qtip-id",V=["ui-widget","ui-tooltip"],W="."+S,X="click dblclick mousedown mouseup mousemove mouseleave mouseenter".split(" "),Y=S+"-fixed",Z=S+"-default",$=S+"-focus",_=S+"-hover",ab=S+"-disabled",bb="_replacedByqTip",cb="oldtitle",db={ie:function(){for(var a=3,c=b.createElement("div");(c.innerHTML="")&&c.getElementsByTagName("i")[0];);return a>4?a:0/0}(),iOS:parseFloat((""+(/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent)||[0,""])[1]).replace("undefined","3_2").replace("_",".").replace("_",""))||E};z=e.prototype,z._when=function(a){return d.when.apply(d,a)},z.render=function(a){if(this.rendered||this.destroyed)return this;var b,c=this,e=this.options,f=this.cache,g=this.elements,h=e.content.text,i=e.content.title,j=e.content.button,k=e.position,l=("."+this._id+" ",[]);return d.attr(this.target[0],"aria-describedby",this._id),this.tooltip=g.tooltip=b=d("
",{id:this._id,"class":[S,Z,e.style.classes,S+"-pos-"+e.position.my.abbrev()].join(" "),width:e.style.width||"",height:e.style.height||"",tracking:"mouse"===k.target&&k.adjust.mouse,role:"alert","aria-live":"polite","aria-atomic":E,"aria-describedby":this._id+"-content","aria-hidden":D}).toggleClass(ab,this.disabled).attr(U,this.id).data(S,this).appendTo(k.container).append(g.content=d("
",{"class":S+"-content",id:this._id+"-content","aria-atomic":D})),this.rendered=-1,this.positioning=D,i&&(this._createTitle(),d.isFunction(i)||l.push(this._updateTitle(i,E))),j&&this._createButton(),d.isFunction(h)||l.push(this._updateContent(h,E)),this.rendered=D,this._setWidget(),d.each(R,function(a){var b;"render"===this.initialize&&(b=this(c))&&(c.plugins[a]=b)}),this._unassignEvents(),this._assignEvents(),this._when(l).then(function(){c._trigger("render"),c.positioning=E,c.hiddenDuringWait||!e.show.ready&&!a||c.toggle(D,f.event,E),c.hiddenDuringWait=E}),y.api[this.id]=this,this},z.destroy=function(a){function b(){if(!this.destroyed){this.destroyed=D;var a=this.target,b=a.attr(cb);this.rendered&&this.tooltip.stop(1,0).find("*").remove().end().remove(),d.each(this.plugins,function(){this.destroy&&this.destroy()}),clearTimeout(this.timers.show),clearTimeout(this.timers.hide),this._unassignEvents(),a.removeData(S).removeAttr(U).removeAttr(T).removeAttr("aria-describedby"),this.options.suppress&&b&&a.attr("title",b).removeAttr(cb),this._unbind(a),this.options=this.elements=this.cache=this.timers=this.plugins=this.mouse=F,delete y.api[this.id]}}return this.destroyed?this.target:(a===D&&"hide"!==this.triggering||!this.rendered?b.call(this):(this.tooltip.one("tooltiphidden",d.proxy(b,this)),!this.triggering&&this.hide()),this.target)},B=z.checks={builtin:{"^id$":function(a,b,c,e){var f=c===D?y.nextid:c,g=S+"-"+f;f!==E&&f.length>0&&!d("#"+g).length?(this._id=g,this.rendered&&(this.tooltip[0].id=this._id,this.elements.content[0].id=this._id+"-content",this.elements.title[0].id=this._id+"-title")):a[b]=e},"^prerender":function(a,b,c){c&&!this.rendered&&this.render(this.options.show.ready)},"^content.text$":function(a,b,c){this._updateContent(c)},"^content.attr$":function(a,b,c,d){this.options.content.text===this.target.attr(d)&&this._updateContent(this.target.attr(c))},"^content.title$":function(a,b,c){return c?(c&&!this.elements.title&&this._createTitle(),this._updateTitle(c),void 0):this._removeTitle()},"^content.button$":function(a,b,c){this._updateButton(c)},"^content.title.(text|button)$":function(a,b,c){this.set("content."+b,c)},"^position.(my|at)$":function(a,b,c){"string"==typeof c&&(a[b]=new A(c,"at"===b))},"^position.container$":function(a,b,c){this.rendered&&this.tooltip.appendTo(c)},"^show.ready$":function(a,b,c){c&&(!this.rendered&&this.render(D)||this.toggle(D))},"^style.classes$":function(a,b,c,d){this.rendered&&this.tooltip.removeClass(d).addClass(c)},"^style.(width|height)":function(a,b,c){this.rendered&&this.tooltip.css(b,c)},"^style.widget|content.title":function(){this.rendered&&this._setWidget()},"^style.def":function(a,b,c){this.rendered&&this.tooltip.toggleClass(Z,!!c)},"^events.(render|show|move|hide|focus|blur)$":function(a,b,c){this.rendered&&this.tooltip[(d.isFunction(c)?"":"un")+"bind"]("tooltip"+b,c)},"^(show|hide|position).(event|target|fixed|inactive|leave|distance|viewport|adjust)":function(){if(this.rendered){var a=this.options.position;this.tooltip.attr("tracking","mouse"===a.target&&a.adjust.mouse),this._unassignEvents(),this._assignEvents()}}}},z.get=function(a){if(this.destroyed)return this;var b=i(this.options,a.toLowerCase()),c=b[0][b[1]];return c.precedance?c.string():c};var eb=/^position\.(my|at|adjust|target|container|viewport)|style|content|show\.ready/i,fb=/^prerender|show\.ready/i;z.set=function(a,b){if(this.destroyed)return this;{var c,e=this.rendered,f=E,g=this.options;this.checks}return"string"==typeof a?(c=a,a={},a[c]=b):a=d.extend({},a),d.each(a,function(b,c){if(e&&fb.test(b))return delete a[b],void 0;var h,j=i(g,b.toLowerCase());h=j[0][j[1]],j[0][j[1]]=c&&c.nodeType?d(c):c,f=eb.test(b)||f,a[b]=[j[0],j[1],c,h]}),h(g),this.positioning=D,d.each(a,d.proxy(j,this)),this.positioning=E,this.rendered&&this.tooltip[0].offsetWidth>0&&f&&this.reposition("mouse"===g.position.target?F:this.cache.event),this},z._update=function(a,b){var c=this,e=this.cache;return this.rendered&&a?(d.isFunction(a)&&(a=a.call(this.elements.target,e.event,this)||""),d.isFunction(a.then)?(e.waiting=D,a.then(function(a){return e.waiting=E,c._update(a,b)},F,function(a){return c._update(a,b)})):a===E||!a&&""!==a?E:(a.jquery&&a.length>0?b.empty().append(a.css({display:"block",visibility:"visible"})):b.html(a),this._waitForContent(b).then(function(a){a.images&&a.images.length&&c.rendered&&c.tooltip[0].offsetWidth>0&&c.reposition(e.event,!a.length)}))):E},z._waitForContent=function(a){var b=this.cache;return b.waiting=D,(d.fn.imagesLoaded?a.imagesLoaded():d.Deferred().resolve([])).done(function(){b.waiting=E}).promise()},z._updateContent=function(a,b){this._update(a,this.elements.content,b)},z._updateTitle=function(a,b){this._update(a,this.elements.title,b)===E&&this._removeTitle(E)},z._createTitle=function(){var a=this.elements,b=this._id+"-title";a.titlebar&&this._removeTitle(),a.titlebar=d("
",{"class":S+"-titlebar "+(this.options.style.widget?k("header"):"")}).append(a.title=d("
",{id:b,"class":S+"-title","aria-atomic":D})).insertBefore(a.content).delegate(".qtip-close","mousedown keydown mouseup keyup mouseout",function(a){d(this).toggleClass("ui-state-active ui-state-focus","down"===a.type.substr(-4))}).delegate(".qtip-close","mouseover mouseout",function(a){d(this).toggleClass("ui-state-hover","mouseover"===a.type)}),this.options.content.button&&this._createButton()},z._removeTitle=function(a){var b=this.elements;b.title&&(b.titlebar.remove(),b.titlebar=b.title=b.button=F,a!==E&&this.reposition())},z.reposition=function(c,e){if(!this.rendered||this.positioning||this.destroyed)return this;this.positioning=D;var f,g,h=this.cache,i=this.tooltip,j=this.options.position,k=j.target,l=j.my,m=j.at,n=j.viewport,o=j.container,p=j.adjust,q=p.method.split(" "),r=i.outerWidth(E),s=i.outerHeight(E),t=0,u=0,v=i.css("position"),w={left:0,top:0},x=i[0].offsetWidth>0,y=c&&"scroll"===c.type,z=d(a),A=o[0].ownerDocument,B=this.mouse;if(d.isArray(k)&&2===k.length)m={x:L,y:K},w={left:k[0],top:k[1]};else if("mouse"===k)m={x:L,y:K},!B||!B.pageX||!p.mouse&&c&&c.pageX?c&&c.pageX||((!p.mouse||this.options.show.distance)&&h.origin&&h.origin.pageX?c=h.origin:(!c||c&&("resize"===c.type||"scroll"===c.type))&&(c=h.event)):c=B,"static"!==v&&(w=o.offset()),A.body.offsetWidth!==(a.innerWidth||A.documentElement.clientWidth)&&(g=d(b.body).offset()),w={left:c.pageX-w.left+(g&&g.left||0),top:c.pageY-w.top+(g&&g.top||0)},p.mouse&&y&&B&&(w.left-=(B.scrollX||0)-z.scrollLeft(),w.top-=(B.scrollY||0)-z.scrollTop());else{if("event"===k?c&&c.target&&"scroll"!==c.type&&"resize"!==c.type?h.target=d(c.target):c.target||(h.target=this.elements.target):"event"!==k&&(h.target=d(k.jquery?k:this.elements.target)),k=h.target,k=d(k).eq(0),0===k.length)return this;k[0]===b||k[0]===a?(t=db.iOS?a.innerWidth:k.width(),u=db.iOS?a.innerHeight:k.height(),k[0]===a&&(w={top:(n||k).scrollTop(),left:(n||k).scrollLeft()})):R.imagemap&&k.is("area")?f=R.imagemap(this,k,m,R.viewport?q:E):R.svg&&k&&k[0].ownerSVGElement?f=R.svg(this,k,m,R.viewport?q:E):(t=k.outerWidth(E),u=k.outerHeight(E),w=k.offset()),f&&(t=f.width,u=f.height,g=f.offset,w=f.position),w=this.reposition.offset(k,w,o),(db.iOS>3.1&&db.iOS<4.1||db.iOS>=4.3&&db.iOS<4.33||!db.iOS&&"fixed"===v)&&(w.left-=z.scrollLeft(),w.top-=z.scrollTop()),(!f||f&&f.adjustable!==E)&&(w.left+=m.x===N?t:m.x===O?t/2:0,w.top+=m.y===M?u:m.y===O?u/2:0)}return w.left+=p.x+(l.x===N?-r:l.x===O?-r/2:0),w.top+=p.y+(l.y===M?-s:l.y===O?-s/2:0),R.viewport?(w.adjusted=R.viewport(this,w,j,t,u,r,s),g&&w.adjusted.left&&(w.left+=g.left),g&&w.adjusted.top&&(w.top+=g.top)):w.adjusted={left:0,top:0},this._trigger("move",[w,n.elem||n],c)?(delete w.adjusted,e===E||!x||isNaN(w.left)||isNaN(w.top)||"mouse"===k||!d.isFunction(j.effect)?i.css(w):d.isFunction(j.effect)&&(j.effect.call(i,this,d.extend({},w)),i.queue(function(a){d(this).css({opacity:"",height:""}),db.ie&&this.style.removeAttribute("filter"),a()})),this.positioning=E,this):this},z.reposition.offset=function(a,c,e){function f(a,b){c.left+=b*a.scrollLeft(),c.top+=b*a.scrollTop()}if(!e[0])return c;var g,h,i,j,k=d(a[0].ownerDocument),l=!!db.ie&&"CSS1Compat"!==b.compatMode,m=e[0];do"static"!==(h=d.css(m,"position"))&&("fixed"===h?(i=m.getBoundingClientRect(),f(k,-1)):(i=d(m).position(),i.left+=parseFloat(d.css(m,"borderLeftWidth"))||0,i.top+=parseFloat(d.css(m,"borderTopWidth"))||0),c.left-=i.left+(parseFloat(d.css(m,"marginLeft"))||0),c.top-=i.top+(parseFloat(d.css(m,"marginTop"))||0),g||"hidden"===(j=d.css(m,"overflow"))||"visible"===j||(g=d(m)));while(m=m.offsetParent);return g&&(g[0]!==k[0]||l)&&f(g,1),c};var gb=(A=z.reposition.Corner=function(a,b){a=(""+a).replace(/([A-Z])/," $1").replace(/middle/gi,O).toLowerCase(),this.x=(a.match(/left|right/i)||a.match(/center/)||["inherit"])[0].toLowerCase(),this.y=(a.match(/top|bottom|center/i)||["inherit"])[0].toLowerCase(),this.forceY=!!b;var c=a.charAt(0);this.precedance="t"===c||"b"===c?H:G}).prototype;gb.invert=function(a,b){this[a]=this[a]===L?N:this[a]===N?L:b||this[a]},gb.string=function(){var a=this.x,b=this.y;return a===b?a:this.precedance===H||this.forceY&&"center"!==b?b+" "+a:a+" "+b},gb.abbrev=function(){var a=this.string().split(" ");return a[0].charAt(0)+(a[1]&&a[1].charAt(0)||"")},gb.clone=function(){return new A(this.string(),this.forceY)},z.toggle=function(a,c){var e=this.cache,f=this.options,g=this.tooltip;if(c){if(/over|enter/.test(c.type)&&/out|leave/.test(e.event.type)&&f.show.target.add(c.target).length===f.show.target.length&&g.has(c.relatedTarget).length)return this;e.event=l(c)}if(this.waiting&&!a&&(this.hiddenDuringWait=D),!this.rendered)return a?this.render(1):this;if(this.destroyed||this.disabled)return this;var h,i,j,k=a?"show":"hide",m=this.options[k],n=(this.options[a?"hide":"show"],this.options.position),o=this.options.content,p=this.tooltip.css("width"),q=this.tooltip.is(":visible"),r=a||1===m.target.length,s=!c||m.target.length<2||e.target[0]===c.target;return(typeof a).search("boolean|number")&&(a=!q),h=!g.is(":animated")&&q===a&&s,i=h?F:!!this._trigger(k,[90]),this.destroyed?this:(i!==E&&a&&this.focus(c),!i||h?this:(d.attr(g[0],"aria-hidden",!a),a?(e.origin=l(this.mouse),d.isFunction(o.text)&&this._updateContent(o.text,E),d.isFunction(o.title)&&this._updateTitle(o.title,E),!C&&"mouse"===n.target&&n.adjust.mouse&&(d(b).bind("mousemove."+S,this._storeMouse),C=D),p||g.css("width",g.outerWidth(E)),this.reposition(c,arguments[2]),p||g.css("width",""),m.solo&&("string"==typeof m.solo?d(m.solo):d(W,m.solo)).not(g).not(m.target).qtip("hide",d.Event("tooltipsolo"))):(clearTimeout(this.timers.show),delete e.origin,C&&!d(W+'[tracking="true"]:visible',m.solo).not(g).length&&(d(b).unbind("mousemove."+S),C=E),this.blur(c)),j=d.proxy(function(){a?(db.ie&&g[0].style.removeAttribute("filter"),g.css("overflow",""),"string"==typeof m.autofocus&&d(this.options.show.autofocus,g).focus(),this.options.show.target.trigger("qtip-"+this.id+"-inactive")):g.css({display:"",visibility:"",opacity:"",left:"",top:""}),this._trigger(a?"visible":"hidden")},this),m.effect===E||r===E?(g[k](),j()):d.isFunction(m.effect)?(g.stop(1,1),m.effect.call(g,this),g.queue("fx",function(a){j(),a()})):g.fadeTo(90,a?1:0,j),a&&m.target.trigger("qtip-"+this.id+"-inactive"),this))},z.show=function(a){return this.toggle(D,a)},z.hide=function(a){return this.toggle(E,a)},z.focus=function(a){if(!this.rendered||this.destroyed)return this;var b=d(W),c=this.tooltip,e=parseInt(c[0].style.zIndex,10),f=y.zindex+b.length;return c.hasClass($)||this._trigger("focus",[f],a)&&(e!==f&&(b.each(function(){this.style.zIndex>e&&(this.style.zIndex=this.style.zIndex-1)}),b.filter("."+$).qtip("blur",a)),c.addClass($)[0].style.zIndex=f),this},z.blur=function(a){return!this.rendered||this.destroyed?this:(this.tooltip.removeClass($),this._trigger("blur",[this.tooltip.css("zIndex")],a),this)},z.disable=function(a){return this.destroyed?this:("toggle"===a?a=!(this.rendered?this.tooltip.hasClass(ab):this.disabled):"boolean"!=typeof a&&(a=D),this.rendered&&this.tooltip.toggleClass(ab,a).attr("aria-disabled",a),this.disabled=!!a,this)},z.enable=function(){return this.disable(E)},z._createButton=function(){var a=this,b=this.elements,c=b.tooltip,e=this.options.content.button,f="string"==typeof e,g=f?e:"Close tooltip";b.button&&b.button.remove(),b.button=e.jquery?e:d("",{"class":"qtip-close "+(this.options.style.widget?"":S+"-icon"),title:g,"aria-label":g}).prepend(d("",{"class":"ui-icon ui-icon-close",html:"×"})),b.button.appendTo(b.titlebar||c).attr("role","button").click(function(b){return c.hasClass(ab)||a.hide(b),E})},z._updateButton=function(a){if(!this.rendered)return E;var b=this.elements.button;a?this._createButton():b.remove()},z._setWidget=function(){var a=this.options.style.widget,b=this.elements,c=b.tooltip,d=c.hasClass(ab);c.removeClass(ab),ab=a?"ui-state-disabled":"qtip-disabled",c.toggleClass(ab,d),c.toggleClass("ui-helper-reset "+k(),a).toggleClass(Z,this.options.style.def&&!a),b.content&&b.content.toggleClass(k("content"),a),b.titlebar&&b.titlebar.toggleClass(k("header"),a),b.button&&b.button.toggleClass(S+"-icon",!a)},z._storeMouse=function(a){(this.mouse=l(a)).type="mousemove"},z._bind=function(a,b,c,e,f){var g="."+this._id+(e?"-"+e:"");b.length&&d(a).bind((b.split?b:b.join(g+" "))+g,d.proxy(c,f||this))},z._unbind=function(a,b){d(a).unbind("."+this._id+(b?"-"+b:""))};var hb="."+S;d(function(){r(W,["mouseenter","mouseleave"],function(a){var b="mouseenter"===a.type,c=d(a.currentTarget),e=d(a.relatedTarget||a.target),f=this.options;b?(this.focus(a),c.hasClass(Y)&&!c.hasClass(ab)&&clearTimeout(this.timers.hide)):"mouse"===f.position.target&&f.hide.event&&f.show.target&&!e.closest(f.show.target[0]).length&&this.hide(a),c.toggleClass(_,b)}),r("["+U+"]",X,p)}),z._trigger=function(a,b,c){var e=d.Event("tooltip"+a);return e.originalEvent=c&&d.extend({},c)||this.cache.event||F,this.triggering=a,this.tooltip.trigger(e,[this].concat(b||[])),this.triggering=E,!e.isDefaultPrevented()},z._bindEvents=function(a,b,c,e,f,g){if(e.add(c).length===e.length){var h=[];b=d.map(b,function(b){var c=d.inArray(b,a);return c>-1?(h.push(a.splice(c,1)[0]),void 0):b}),h.length&&this._bind(c,h,function(a){var b=this.rendered?this.tooltip[0].offsetWidth>0:!1;(b?g:f).call(this,a)})}this._bind(c,a,f),this._bind(e,b,g)},z._assignInitialEvents=function(a){function b(a){return this.disabled||this.destroyed?E:(this.cache.event=l(a),this.cache.target=a?d(a.target):[c],clearTimeout(this.timers.show),this.timers.show=m.call(this,function(){this.render("object"==typeof a||e.show.ready)},e.show.delay),void 0)}var e=this.options,f=e.show.target,g=e.hide.target,h=e.show.event?d.trim(""+e.show.event).split(" "):[],i=e.hide.event?d.trim(""+e.hide.event).split(" "):[];/mouse(over|enter)/i.test(e.show.event)&&!/mouse(out|leave)/i.test(e.hide.event)&&i.push("mouseleave"),this._bind(f,"mousemove",function(a){this._storeMouse(a),this.cache.onTarget=D}),this._bindEvents(h,i,f,g,b,function(){clearTimeout(this.timers.show)}),(e.show.ready||e.prerender)&&b.call(this,a)},z._assignEvents=function(){var c=this,e=this.options,f=e.position,g=this.tooltip,h=e.show.target,i=e.hide.target,j=f.container,k=f.viewport,l=d(b),m=(d(b.body),d(a)),r=e.show.event?d.trim(""+e.show.event).split(" "):[],s=e.hide.event?d.trim(""+e.hide.event).split(" "):[];d.each(e.events,function(a,b){c._bind(g,"toggle"===a?["tooltipshow","tooltiphide"]:["tooltip"+a],b,null,g)}),/mouse(out|leave)/i.test(e.hide.event)&&"window"===e.hide.leave&&this._bind(l,["mouseout","blur"],function(a){/select|option/.test(a.target.nodeName)||a.relatedTarget||this.hide(a)}),e.hide.fixed?i=i.add(g.addClass(Y)):/mouse(over|enter)/i.test(e.show.event)&&this._bind(i,"mouseleave",function(){clearTimeout(this.timers.show)}),(""+e.hide.event).indexOf("unfocus")>-1&&this._bind(j.closest("html"),["mousedown","touchstart"],function(a){var b=d(a.target),c=this.rendered&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0,e=b.parents(W).filter(this.tooltip[0]).length>0;b[0]===this.target[0]||b[0]===this.tooltip[0]||e||this.target.has(b[0]).length||!c||this.hide(a)}),"number"==typeof e.hide.inactive&&(this._bind(h,"qtip-"+this.id+"-inactive",p),this._bind(i.add(g),y.inactiveEvents,p,"-inactive")),this._bindEvents(r,s,h,i,n,o),this._bind(h.add(g),"mousemove",function(a){if("number"==typeof e.hide.distance){var b=this.cache.origin||{},c=this.options.hide.distance,d=Math.abs;(d(a.pageX-b.pageX)>=c||d(a.pageY-b.pageY)>=c)&&this.hide(a)}this._storeMouse(a)}),"mouse"===f.target&&f.adjust.mouse&&(e.hide.event&&this._bind(h,["mouseenter","mouseleave"],function(a){this.cache.onTarget="mouseenter"===a.type}),this._bind(l,"mousemove",function(a){this.rendered&&this.cache.onTarget&&!this.tooltip.hasClass(ab)&&this.tooltip[0].offsetWidth>0&&this.reposition(a)})),(f.adjust.resize||k.length)&&this._bind(d.event.special.resize?k:m,"resize",q),f.adjust.scroll&&this._bind(m.add(f.container),"scroll",q)},z._unassignEvents=function(){var c=[this.options.show.target[0],this.options.hide.target[0],this.rendered&&this.tooltip[0],this.options.position.container[0],this.options.position.viewport[0],this.options.position.container.closest("html")[0],a,b];this._unbind(d([]).pushStack(d.grep(c,function(a){return"object"==typeof a})))},y=d.fn.qtip=function(a,b,e){var f=(""+a).toLowerCase(),g=F,i=d.makeArray(arguments).slice(1),j=i[i.length-1],k=this[0]?d.data(this[0],S):F;return!arguments.length&&k||"api"===f?k:"string"==typeof a?(this.each(function(){var a=d.data(this,S);if(!a)return D;if(j&&j.timeStamp&&(a.cache.event=j),!b||"option"!==f&&"options"!==f)a[f]&&a[f].apply(a,i);else{if(e===c&&!d.isPlainObject(b))return g=a.get(b),E;a.set(b,e)}}),g!==F?g:this):"object"!=typeof a&&arguments.length?void 0:(k=h(d.extend(D,{},a)),this.each(function(a){var b,c;return c=d.isArray(k.id)?k.id[a]:k.id,c=!c||c===E||c.length<1||y.api[c]?y.nextid++:c,b=s(d(this),c,k),b===E?D:(y.api[c]=b,d.each(R,function(){"initialize"===this.initialize&&this(b)}),b._assignInitialEvents(j),void 0)}))},d.qtip=e,y.api={},d.each({attr:function(a,b){if(this.length){var c=this[0],e="title",f=d.data(c,"qtip");if(a===e&&f&&"object"==typeof f&&f.options.suppress)return arguments.length<2?d.attr(c,cb):(f&&f.options.content.attr===e&&f.cache.attr&&f.set("content.text",b),this.attr(cb,b))}return d.fn["attr"+bb].apply(this,arguments)},clone:function(a){var b=(d([]),d.fn["clone"+bb].apply(this,arguments));return a||b.filter("["+cb+"]").attr("title",function(){return d.attr(this,cb)}).removeAttr(cb),b}},function(a,b){if(!b||d.fn[a+bb])return D;var c=d.fn[a+bb]=d.fn[a];d.fn[a]=function(){return b.apply(this,arguments)||c.apply(this,arguments)}}),d.ui||(d["cleanData"+bb]=d.cleanData,d.cleanData=function(a){for(var b,c=0;(b=d(a[c])).length;c++)if(b.attr(T))try{b.triggerHandler("removeqtip")}catch(e){}d["cleanData"+bb].apply(this,arguments)}),y.version="2.2.0",y.nextid=0,y.inactiveEvents=X,y.zindex=15e3,y.defaults={prerender:E,id:E,overwrite:D,suppress:D,content:{text:D,attr:"title",title:E,button:E},position:{my:"top left",at:"bottom right",target:E,container:E,viewport:E,adjust:{x:0,y:0,mouse:D,scroll:D,resize:D,method:"flipinvert flipinvert"},effect:function(a,b){d(this).animate(b,{duration:200,queue:E})}},show:{target:E,event:"mouseenter",effect:D,delay:90,solo:E,ready:E,autofocus:E},hide:{target:E,event:"mouseleave",effect:D,delay:0,fixed:E,inactive:E,leave:"window",distance:E},style:{classes:"",widget:E,width:E,height:E,def:D},events:{render:F,move:F,show:F,hide:F,toggle:F,visible:F,hidden:F,focus:F,blur:F}};var ib,jb="margin",kb="border",lb="color",mb="background-color",nb="transparent",ob=" !important",pb=!!b.createElement("canvas").getContext,qb=/rgba?\(0, 0, 0(, 0)?\)|transparent|#123456/i,rb={},sb=["Webkit","O","Moz","ms"];if(pb)var tb=a.devicePixelRatio||1,ub=function(){var a=b.createElement("canvas").getContext("2d");return a.backingStorePixelRatio||a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||1}(),vb=tb/ub;else var wb=function(a,b,c){return"'};d.extend(w.prototype,{init:function(a){var b,c;c=this.element=a.elements.tip=d("
",{"class":S+"-tip"}).prependTo(a.tooltip),pb?(b=d("").appendTo(this.element)[0].getContext("2d"),b.lineJoin="miter",b.miterLimit=1e5,b.save()):(b=wb("shape",'coordorigin="0,0"',"position:absolute;"),this.element.html(b+b),a._bind(d("*",c).add(c),["click","mousedown"],function(a){a.stopPropagation()},this._ns)),a._bind(a.tooltip,"tooltipmove",this.reposition,this._ns,this),this.create()},_swapDimensions:function(){this.size[0]=this.options.height,this.size[1]=this.options.width},_resetDimensions:function(){this.size[0]=this.options.width,this.size[1]=this.options.height},_useTitle:function(a){var b=this.qtip.elements.titlebar;return b&&(a.y===K||a.y===O&&this.element.position().top+this.size[1]/2+this.options.offsetl&&!qb.test(e[1])&&(e[0]=e[1]),this.border=l=p.border!==D?p.border:l):this.border=l=0,k=this.size=this._calculateSize(b),n.css({width:k[0],height:k[1],lineHeight:k[1]+"px"}),j=b.precedance===H?[s(r.x===L?l:r.x===N?k[0]-q[0]-l:(k[0]-q[0])/2),s(r.y===K?k[1]-q[1]:0)]:[s(r.x===L?k[0]-q[0]:0),s(r.y===K?l:r.y===M?k[1]-q[1]-l:(k[1]-q[1])/2)],pb?(g=o[0].getContext("2d"),g.restore(),g.save(),g.clearRect(0,0,6e3,6e3),h=this._calculateTip(r,q,vb),i=this._calculateTip(r,this.size,vb),o.attr(I,k[0]*vb).attr(J,k[1]*vb),o.css(I,k[0]).css(J,k[1]),this._drawCoords(g,i),g.fillStyle=e[1],g.fill(),g.translate(j[0]*vb,j[1]*vb),this._drawCoords(g,h),g.fillStyle=e[0],g.fill()):(h=this._calculateTip(r),h="m"+h[0]+","+h[1]+" l"+h[2]+","+h[3]+" "+h[4]+","+h[5]+" xe",j[2]=l&&/^(r|b)/i.test(b.string())?8===db.ie?2:1:0,o.css({coordsize:k[0]+l+" "+(k[1]+l),antialias:""+(r.string().indexOf(O)>-1),left:j[0]-j[2]*Number(f===G),top:j[1]-j[2]*Number(f===H),width:k[0]+l,height:k[1]+l}).each(function(a){var b=d(this);b[b.prop?"prop":"attr"]({coordsize:k[0]+l+" "+(k[1]+l),path:h,fillcolor:e[0],filled:!!a,stroked:!a}).toggle(!(!l&&!a)),!a&&b.html(wb("stroke",'weight="'+2*l+'px" color="'+e[1]+'" miterlimit="1000" joinstyle="miter"'))})),a.opera&&setTimeout(function(){m.tip.css({display:"inline-block",visibility:"visible"})},1),c!==E&&this.calculate(b,k)},calculate:function(a,b){if(!this.enabled)return E;var c,e,f=this,g=this.qtip.elements,h=this.element,i=this.options.offset,j=(g.tooltip.hasClass("ui-widget"),{});return a=a||this.corner,c=a.precedance,b=b||this._calculateSize(a),e=[a.x,a.y],c===G&&e.reverse(),d.each(e,function(d,e){var h,k,l;e===O?(h=c===H?L:K,j[h]="50%",j[jb+"-"+h]=-Math.round(b[c===H?0:1]/2)+i):(h=f._parseWidth(a,e,g.tooltip),k=f._parseWidth(a,e,g.content),l=f._parseRadius(a),j[e]=Math.max(-f.border,d?k:i+(l>h?l:-h))) -}),j[a[c]]-=b[c===G?0:1],h.css({margin:"",top:"",bottom:"",left:"",right:""}).css(j),j},reposition:function(a,b,d){function e(a,b,c,d,e){a===Q&&j.precedance===b&&k[d]&&j[c]!==O?j.precedance=j.precedance===G?H:G:a!==Q&&k[d]&&(j[b]=j[b]===O?k[d]>0?d:e:j[b]===d?e:d)}function f(a,b,e){j[a]===O?p[jb+"-"+b]=o[a]=g[jb+"-"+b]-k[b]:(h=g[e]!==c?[k[b],-g[b]]:[-k[b],g[b]],(o[a]=Math.max(h[0],h[1]))>h[0]&&(d[b]-=k[b],o[b]=E),p[g[e]!==c?e:b]=o[a])}if(this.enabled){var g,h,i=b.cache,j=this.corner.clone(),k=d.adjusted,l=b.options.position.adjust.method.split(" "),m=l[0],n=l[1]||l[0],o={left:E,top:E,x:0,y:0},p={};this.corner.fixed!==D&&(e(m,G,H,L,N),e(n,H,G,K,M),j.string()===i.corner.string()||i.cornerTop===k.top&&i.cornerLeft===k.left||this.update(j,E)),g=this.calculate(j),g.right!==c&&(g.left=-g.right),g.bottom!==c&&(g.top=-g.bottom),g.user=this.offset,(o.left=m===Q&&!!k.left)&&f(G,L,N),(o.top=n===Q&&!!k.top)&&f(H,K,M),this.element.css(p).toggle(!(o.x&&o.y||j.x===O&&o.y||j.y===O&&o.x)),d.left-=g.left.charAt?g.user:m!==Q||o.top||!o.left&&!o.top?g.left+this.border:0,d.top-=g.top.charAt?g.user:n!==Q||o.left||!o.left&&!o.top?g.top+this.border:0,i.cornerLeft=k.left,i.cornerTop=k.top,i.corner=j.clone()}},destroy:function(){this.qtip._unbind(this.qtip.tooltip,this._ns),this.qtip.elements.tip&&this.qtip.elements.tip.find("*").remove().end().remove()}}),ib=R.tip=function(a){return new w(a,a.options.style.tip)},ib.initialize="render",ib.sanitize=function(a){if(a.style&&"tip"in a.style){var b=a.style.tip;"object"!=typeof b&&(b=a.style.tip={corner:b}),/string|boolean/i.test(typeof b.corner)||(b.corner=D)}},B.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){this.create(),this.qtip.reposition()},"^style.tip.(height|width)$":function(a){this.size=[a.width,a.height],this.update(),this.qtip.reposition()},"^content.title|style.(classes|widget)$":function(){this.update()}},d.extend(D,y.defaults,{style:{tip:{corner:D,mimic:E,width:6,height:6,border:D,offset:0}}}),R.viewport=function(c,d,e,f,g,h,i){function j(a,b,c,e,f,g,h,i,j){var k=d[f],m=v[a],t=w[a],u=c===Q,x=m===f?j:m===g?-j:-j/2,y=t===f?i:t===g?-i:-i/2,z=r[f]+s[f]-(o?0:n[f]),A=z-k,B=k+j-(h===I?p:q)-z,C=x-(v.precedance===a||m===v[b]?y:0)-(t===O?i/2:0);return u?(C=(m===f?1:-1)*x,d[f]+=A>0?A:B>0?-B:0,d[f]=Math.max(-n[f]+s[f],k-C,Math.min(Math.max(-n[f]+s[f]+(h===I?p:q),k+C),d[f],"center"===m?k-x:1e9))):(e*=c===P?2:0,A>0&&(m!==f||B>0)?(d[f]-=C+e,l.invert(a,f)):B>0&&(m!==g||A>0)&&(d[f]-=(m===O?-C:C)+e,l.invert(a,g)),d[f]B&&(d[f]=k,l=v.clone())),d[f]-k}var k,l,m,n,o,p,q,r,s,t=e.target,u=c.elements.tooltip,v=e.my,w=e.at,x=e.adjust,y=x.method.split(" "),z=y[0],A=y[1]||y[0],B=e.viewport,C=e.container,D=c.cache,F={left:0,top:0};return B.jquery&&t[0]!==a&&t[0]!==b.body&&"none"!==x.method?(n=C.offset()||F,o="static"===C.css("position"),k="fixed"===u.css("position"),p=B[0]===a?B.width():B.outerWidth(E),q=B[0]===a?B.height():B.outerHeight(E),r={left:k?0:B.scrollLeft(),top:k?0:B.scrollTop()},s=B.offset()||F,("shift"!==z||"shift"!==A)&&(l=v.clone()),F={left:"none"!==z?j(G,H,z,x.x,L,N,I,f,h):0,top:"none"!==A?j(H,G,A,x.y,K,M,J,g,i):0},l&&D.lastClass!==(m=S+"-pos-"+l.abbrev())&&u.removeClass(c.cache.lastClass).addClass(c.cache.lastClass=m),F):F},R.polys={polygon:function(a,b){var c,d,e,f={width:0,height:0,position:{top:1e10,right:0,bottom:0,left:1e10},adjustable:E},g=0,h=[],i=1,j=1,k=0,l=0;for(g=a.length;g--;)c=[parseInt(a[--g],10),parseInt(a[g+1],10)],c[0]>f.position.right&&(f.position.right=c[0]),c[0]f.position.bottom&&(f.position.bottom=c[1]),c[1]0&&e>0&&i>0&&j>0;)for(d=Math.floor(d/2),e=Math.floor(e/2),b.x===L?i=d:b.x===N?i=f.width-d:i+=Math.floor(d/2),b.y===K?j=e:b.y===M?j=f.height-e:j+=Math.floor(e/2),g=h.length;g--&&!(h.length<2);)k=h[g][0]-f.position.left,l=h[g][1]-f.position.top,(b.x===L&&k>=i||b.x===N&&i>=k||b.x===O&&(i>k||k>f.width-i)||b.y===K&&l>=j||b.y===M&&j>=l||b.y===O&&(j>l||l>f.height-j))&&h.splice(g,1);f.position={left:h[0][0],top:h[0][1]}}return f},rect:function(a,b,c,d){return{width:Math.abs(c-a),height:Math.abs(d-b),position:{left:Math.min(a,c),top:Math.min(b,d)}}},_angles:{tc:1.5,tr:7/4,tl:5/4,bc:.5,br:.25,bl:.75,rc:2,lc:1,c:0},ellipse:function(a,b,c,d,e){var f=R.polys._angles[e.abbrev()],g=0===f?0:c*Math.cos(f*Math.PI),h=d*Math.sin(f*Math.PI);return{width:2*c-Math.abs(g),height:2*d-Math.abs(h),position:{left:a+g,top:b+h},adjustable:E}},circle:function(a,b,c,d){return R.polys.ellipse(a,b,c,c,d)}},R.svg=function(a,c,e){for(var f,g,h,i,j,k,l,m,n,o,p,q=d(b),r=c[0],s=d(r.ownerSVGElement),t=1,u=1,v=!0;!r.getBBox;)r=r.parentNode;if(!r.getBBox||!r.parentNode)return E;f=s.attr("width")||s.width()||parseInt(s.css("width"),10),g=s.attr("height")||s.height()||parseInt(s.css("height"),10);var w=(parseInt(c.css("stroke-width"),10)||0)/2;switch(w&&(t+=w/f,u+=w/g),r.nodeName){case"ellipse":case"circle":o=R.polys.ellipse(r.cx.baseVal.value,r.cy.baseVal.value,(r.rx||r.r).baseVal.value+w,(r.ry||r.r).baseVal.value+w,e);break;case"line":case"polygon":case"polyline":for(n=r.points||[{x:r.x1.baseVal.value,y:r.y1.baseVal.value},{x:r.x2.baseVal.value,y:r.y2.baseVal.value}],o=[],m=-1,k=n.numberOfItems||n.length;++mparseInt(h[0].style.zIndex,10),b||e.closest(W)[0]===h[0]||c(e),g=a.target===k[k.length-1]}}var f,g,h,i,j=this,k={};d.extend(j,{init:function(){return i=j.elem=d("
",{id:"qtip-overlay",html:"
",mousedown:function(){return E}}).hide(),d(b.body).bind("focusin"+Ab,e),d(b).bind("keydown"+Ab,function(a){f&&f.options.show.modal.escape&&27===a.keyCode&&f.hide(a)}),i.bind("click"+Ab,function(a){f&&f.options.show.modal.blur&&f.hide(a)}),j},update:function(b){f=b,k=b.options.show.modal.stealfocus!==E?b.tooltip.find("*").filter(function(){return a(this)}):[]},toggle:function(a,e,g){var k=(d(b.body),a.tooltip),l=a.options.show.modal,m=l.effect,n=e?"show":"hide",o=i.is(":visible"),p=d(Ab).filter(":visible:not(:animated)").not(k);return j.update(a),e&&l.stealfocus!==E&&c(d(":focus")),i.toggleClass("blurs",l.blur),e&&i.appendTo(b.body),i.is(":animated")&&o===e&&h!==E||!e&&p.length?j:(i.stop(D,E),d.isFunction(m)?m.call(i,e):m===E?i[n]():i.fadeTo(parseInt(g,10)||90,e?1:0,function(){e||i.hide()}),e||i.queue(function(a){i.css({left:"",top:""}),d(Ab).length||i.detach(),a()}),h=e,f.destroyed&&(f=F),j)}}),j.init()},yb=new yb,d.extend(x.prototype,{init:function(a){var b=a.tooltip;return this.options.on?(a.elements.overlay=yb.elem,b.addClass(zb).css("z-index",y.modal_zindex+d(Ab).length),a._bind(b,["tooltipshow","tooltiphide"],function(a,c,e){var f=a.originalEvent;if(a.target===b[0])if(f&&"tooltiphide"===a.type&&/mouse(leave|enter)/.test(f.type)&&d(f.relatedTarget).closest(yb.elem[0]).length)try{a.preventDefault()}catch(g){}else(!f||f&&"tooltipsolo"!==f.type)&&this.toggle(a,"tooltipshow"===a.type,e)},this._ns,this),a._bind(b,"tooltipfocus",function(a,c){if(!a.isDefaultPrevented()&&a.target===b[0]){var e=d(Ab),f=y.modal_zindex+e.length,g=parseInt(b[0].style.zIndex,10);yb.elem[0].style.zIndex=f-1,e.each(function(){this.style.zIndex>g&&(this.style.zIndex-=1)}),e.filter("."+$).qtip("blur",a.originalEvent),b.addClass($)[0].style.zIndex=f,yb.update(c);try{a.preventDefault()}catch(h){}}},this._ns,this),a._bind(b,"tooltiphide",function(a){a.target===b[0]&&d(Ab).filter(":visible").not(b).last().qtip("focus",a)},this._ns,this),void 0):this},toggle:function(a,b,c){return a&&a.isDefaultPrevented()?this:(yb.toggle(this.qtip,!!b,c),void 0)},destroy:function(){this.qtip.tooltip.removeClass(zb),this.qtip._unbind(this.qtip.tooltip,this._ns),yb.toggle(this.qtip,E),delete this.qtip.elements.overlay}}),xb=R.modal=function(a){return new x(a,a.options.show.modal)},xb.sanitize=function(a){a.show&&("object"!=typeof a.show.modal?a.show.modal={on:!!a.show.modal}:"undefined"==typeof a.show.modal.on&&(a.show.modal.on=D))},y.modal_zindex=y.zindex-200,xb.initialize="render",B.modal={"^show.modal.(on|blur)$":function(){this.destroy(),this.init(),this.qtip.elems.overlay.toggle(this.qtip.tooltip[0].offsetWidth>0)}},d.extend(D,y.defaults,{show:{modal:{on:E,effect:D,blur:D,stealfocus:D,escape:D}}})})}(window,document); -//# sourceMappingURL=http://cdnjs.cloudflare.com/ajax/libs/qtip2/2.2.0//var/www/qtip2/build/tmp/tmp-11954vgjofvk/jquery.qtip.min.map \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/package.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/package.json deleted file mode 100644 index 29c70e5a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "displaymodel", - "version": "1.0.0", - "dependencies": {}, - "devDependencies": { - "grunt": "0.4.2", - "grunt-autoprefixer": "0.4.0", - "grunt-bower-install": "0.7.0", - "grunt-concurrent": "0.4.1", - "grunt-contrib-clean": "0.5.0", - "grunt-contrib-coffee": "0.7.0", - "grunt-contrib-compass": "0.6.0", - "grunt-contrib-concat": "0.3.0", - "grunt-contrib-connect": "0.5.0", - "grunt-contrib-copy": "0.4.1", - "grunt-contrib-cssmin": "0.7.0", - "grunt-contrib-htmlmin": "0.1.3", - "grunt-contrib-imagemin": "0.3.0", - "grunt-contrib-jshint": "0.7.1", - "grunt-contrib-uglify": "0.2.0", - "grunt-contrib-watch": "0.5.2", - "grunt-google-cdn": "0.2.0", - "grunt-newer": "0.5.4", - "grunt-ng-annotate": "0.5.0", - "grunt-rev": "0.1.0", - "grunt-svgmin": "0.2.0", - "grunt-usemin": "2.0.0", - "jshint-stylish": "0.1.3", - "load-grunt-tasks": "0.2.0", - "time-grunt": "0.2.1", - "grunt-text-replace": "0.3.11", - "grunt-contrib-rename": "0.0.3" - }, - "engines": { - "node": ">=0.8.0" - } -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/raphael.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/raphael.min.js deleted file mode 100644 index a901777f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/display/raphael.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Raphael=e():t.Raphael=e()}(window,function(){return function(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:i})},r.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=4)}([function(t,e,r){var i,n;i=[r(3)],void 0===(n=function(t){function e(i){if(e.is(i,"function"))return r?i():t.on("raphael.DOMload",i);if(e.is(i,T))return e._engine.create[c](e,i.splice(0,3+e.is(i[0],A))).add(i);var n=Array.prototype.slice.call(arguments,0);if(e.is(n[n.length-1],"function")){var a=n.pop();return r?a.call(e._engine.create[c](e,n)):t.on("raphael.DOMload",function(){a.call(e._engine.create[c](e,n))})}return e._engine.create[c](e,arguments)}e.version="2.2.0",e.eve=t;var r,i,n=/[, ]+/,a={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},s=/\{(\d+)\}/g,o="hasOwnProperty",l={doc:document,win:window},h={was:Object.prototype[o].call(l.win,"Raphael"),is:l.win.Raphael},u=function(){this.ca=this.customAttributes={}},c="apply",f="concat",p="ontouchstart"in l.win||l.win.DocumentTouch&&l.doc instanceof DocumentTouch,d="",g=" ",x=String,v="split",y="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[v](g),m={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},b=x.prototype.toLowerCase,_=Math,w=_.max,k=_.min,B=_.abs,C=_.pow,S=_.PI,A="number",T="array",M=Object.prototype.toString,E=(e._ISURL=/^url\(['"]?(.+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),N={NaN:1,Infinity:1,"-Infinity":1},L=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,P=_.round,z=parseFloat,F=parseInt,R=x.prototype.toUpperCase,j=e._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0,class:""},I=e._availableAnimAttrs={blur:A,"clip-rect":"csv",cx:A,cy:A,fill:"colour","fill-opacity":A,"font-size":A,height:A,opacity:A,path:"path",r:A,rx:A,ry:A,stroke:"colour","stroke-opacity":A,"stroke-width":A,transform:"transform",width:A,x:A,y:A},D=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,q={hs:1,rg:1},O=/,?([achlmqrstvxz]),?/gi,V=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,Y=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,W=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,G=(e._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),H=function(t,e){return z(t)-z(e)},X=function(t){return t},U=e._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},$=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},Z=e._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return $(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return $(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return U(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return U(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return U(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return U(e.x,e.y,e.width,e.height)}},Q=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(n=0,s=(t=At(t)).length;n',(J=K.firstChild).style.behavior="url(#default#VML)",!J||"object"!=typeof J.adj)return e.type=d;K=null}function tt(t){if("function"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var r in t)t[o](r)&&(e[r]=tt(t[r]));return e}e.svg=!(e.vml="VML"==e.type),e._Paper=u,e.fn=i=u.prototype=e.prototype,e._id=0,e.is=function(t,e){return"finite"==(e=b.call(e))?!N[o](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||M.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*_.atan2(-l,-o)/S+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*S/180},e.deg=function(t){return Math.round(180*t/S%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,"finite")?i:10,e.is(t,T)){for(var n=t.length;n--;)if(B(t[n]-r)<=i)return t[n]}else{var a=r%(t=+t);if(at-i)return r-a+t}return r};var et,rt;e.createUUID=(et=/[xy]/g,rt=function(t){var e=16*_.random()|0;return("x"==t?e:3&e|8).toString(16)},function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(et,rt).toUpperCase()});e.setWindow=function(r){t("raphael.setWindow",e,l.win,r),l.win=r,l.doc=l.win.document,e._engine.initWin&&e._engine.initWin(l.win)};var it=function(t){if(e.vml){var r,i=/^\s+|\s+$/g;try{var n=new ActiveXObject("htmlfile");n.write(""),n.close(),r=n.body}catch(t){r=createPopup().document.body}var a=r.createTextRange();it=ht(function(t){try{r.style.color=x(t).replace(i,d);var e=a.queryCommandValue("ForeColor");return"#"+("000000"+(e=(255&e)<<16|65280&e|(16711680&e)>>>16).toString(16)).slice(-6)}catch(t){return"none"}})}else{var s=l.doc.createElement("i");s.title="Raphaël Colour Picker",s.style.display="none",l.doc.body.appendChild(s),it=ht(function(t){return s.style.color=t,l.doc.defaultView.getComputedStyle(s,d).getPropertyValue("color")})}return it(t)},nt=function(){return"hsb("+[this.h,this.s,this.b]+")"},at=function(){return"hsl("+[this.h,this.s,this.l]+")"},st=function(){return this.hex},ot=function(t,r,i){if(null==r&&e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,"string")){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},lt=function(t,r,i,n){var a={r:t*=255,g:r*=255,b:i*=255,hex:e.rgb(t,r,i),toString:st};return e.is(n,"finite")&&(a.opacity=n),a};function ht(t,e,r){return function i(){var n=Array.prototype.slice.call(arguments,0),a=n.join("␀"),s=i.cache=i.cache||{},l=i.count=i.count||[];return s[o](a)?(function(t,e){for(var r=0,i=t.length;r=1e3&&delete s[l.shift()],l.push(a),s[a]=t[c](e,n),r?r(s[a]):s[a])}}e.color=function(t){var r;return e.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,"string")&&(t=e.getRGB(t)),e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:"none"}).r=t.g=t.b=t.h=t.s=t.v=t.l=-1),t.toString=st,t},e.hsb2rgb=function(t,e,r,i){var n,a,s,o,l;return this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),o=(l=r*e)*(1-B((t=(t*=360)%360/60)%2-1)),n=a=s=r-l,lt(n+=[l,o,0,0,o,l][t=~~t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],i)},e.hsl2rgb=function(t,e,r,i){var n,a,s,o,l;return this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),t=(t*=360)%360/60,o=(l=2*e*(r<.5?r:1-r))*(1-B(t%2-1)),n=a=s=r-l/2,lt(n+=[l,o,0,0,o,l][t=~~t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],i)},e.rgb2hsb=function(t,e,r){var i,n;return t=(r=ot(t,e,r))[0],e=r[1],r=r[2],{h:((0==(n=(i=w(t,e,r))-k(t,e,r))?null:i==t?(e-r)/n:i==e?(r-t)/n+2:(t-e)/n+4)+360)%6*60/360,s:0==n?0:n/i,b:i,toString:nt}},e.rgb2hsl=function(t,e,r){var i,n,a,s;return t=(r=ot(t,e,r))[0],e=r[1],r=r[2],i=((n=w(t,e,r))+(a=k(t,e,r)))/2,{h:((0==(s=n-a)?null:n==t?(e-r)/s:n==e?(r-t)/s+2:(t-e)/s+4)+360)%6*60/360,s:0==s?0:i<.5?s/(2*i):s/(2-2*i),l:i,toString:at}},e._path2string=function(){return this.join(",").replace(O,"$1")};e._preload=function(t,e){var r=l.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,l.doc.body.removeChild(this)},r.onerror=function(){l.doc.body.removeChild(this)},l.doc.body.appendChild(r),r.src=t};function ut(){return this.hex}function ct(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}e.getRGB=ht(function(t){if(!t||(t=x(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:ut};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:ut};!q[o](t.toLowerCase().substring(0,2))&&"#"!=t.charAt()&&(t=it(t));var r,i,n,a,s,l,h=t.match(E);return h?(h[2]&&(n=F(h[2].substring(5),16),i=F(h[2].substring(3,5),16),r=F(h[2].substring(1,3),16)),h[3]&&(n=F((s=h[3].charAt(3))+s,16),i=F((s=h[3].charAt(2))+s,16),r=F((s=h[3].charAt(1))+s,16)),h[4]&&(l=h[4][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),"rgba"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100)),h[5]?(l=h[5][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(r/=360),"hsba"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),e.hsb2rgb(r,i,n,a)):h[6]?(l=h[6][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(r/=360),"hsla"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),e.hsl2rgb(r,i,n,a)):((h={r:r,g:i,b:n,toString:ut}).hex="#"+(16777216|n|i<<8|r<<16).toString(16).slice(1),e.is(a,"finite")&&(h.opacity=a),h)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:ut}},e),e.hsb=ht(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=ht(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=ht(function(t,e,r){function i(t){return t+.5|0}return"#"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=ft(t);if(r.arr)return mt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,T)&&e.is(t[0],T)&&(n=mt(t)),n.length||x(t).replace(V,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(W,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][f](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][f](a));else for(;a.length>=i[s]&&(n.push([e][f](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=mt(n),n},e.parseTransformString=ht(function(t){if(!t)return null;var r=[];return e.is(t,T)&&e.is(t[0],T)&&(r=mt(t)),r.length||x(t).replace(Y,function(t,e,i){var n=[];b.call(e);i.replace(W,function(t,e){e&&n.push(+e)}),r.push([e][f](n))}),r.toString=e._path2string,r});var ft=function(t){var e=ft.ps=ft.ps||{};return e[t]?e[t].sleep=100:e[t]={sleep:100},setTimeout(function(){for(var r in e)e[o](r)&&r!=t&&(e[r].sleep--,!e[r].sleep&&delete e[r])}),e[t]};function pt(t,e,r,i,n){return t*(t*(-3*e+9*r-9*i+3*n)+6*e-12*r+6*i)-3*e+3*r}function dt(t,e,r,i,n,a,s,o,l){null==l&&(l=1);for(var h=(l=l>1?1:l<0?0:l)/2,u=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],c=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],f=0,p=0;p<12;p++){var d=h*u[p]+h,g=pt(d,t,r,n,s),x=pt(d,e,i,a,o),v=g*g+x*x;f+=c[p]*_.sqrt(v)}return h*f}function gt(t,e,r,i,n,a,s,o){if(!(w(t,r)w(n,s)||w(e,i)w(a,o))){var l=(t-r)*(a-o)-(e-i)*(n-s);if(l){var h=((t*i-e*r)*(n-s)-(t-r)*(n*o-a*s))/l,u=((t*i-e*r)*(a-o)-(e-i)*(n*o-a*s))/l,c=+h.toFixed(2),f=+u.toFixed(2);if(!(c<+k(t,r).toFixed(2)||c>+w(t,r).toFixed(2)||c<+k(n,s).toFixed(2)||c>+w(n,s).toFixed(2)||f<+k(e,i).toFixed(2)||f>+w(e,i).toFixed(2)||f<+k(a,o).toFixed(2)||f>+w(a,o).toFixed(2)))return{x:h,y:u}}}}function xt(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=dt.apply(0,t),o=dt.apply(0,r),l=w(~~(s/5),1),h=w(~~(o/5),1),u=[],c=[],f={},p=i?0:[],d=0;d=0&&A<=1.001&&T>=0&&T<=1.001&&(i?p++:p.push({x:S.x,y:S.y,t1:k(A,1),t2:k(T,1)}))}}return p}function vt(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,p,d=i?0:[],g=0,x=t.length;gy||v=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.xr.x||r.xt.x)&&(t.yr.y||r.yt.y)},e.pathIntersection=function(t,e){return vt(t,e)},e.pathIntersectionNumber=function(t,e){return vt(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&vt(t,[["M",r,i],["H",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t("raphael.log",null,"Raphaël: you are calling to method “"+e+"” of removed object",e)}};var yt=e.pathBBox=function(t){var e=ft(t);if(e.bbox)return tt(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};for(var r,i=0,n=0,a=[],s=[],o=0,l=(t=At(t)).length;o1&&(r*=m=_.sqrt(m),i*=m);var b=r*r,w=i*i,k=(a==s?-1:1)*_.sqrt(B((b*w-b*y*y-w*x*x)/(b*y*y+w*x*x))),C=k*r*y/i+(t+o)/2,A=k*-i*x/r+(e+l)/2,T=_.asin(((e-A)/i).toFixed(9)),M=_.asin(((l-A)/i).toFixed(9));T=tM&&(T-=2*S),!s&&M>T&&(M-=2*S)}var E=M-T;if(B(E)>c){var N=M,L=o,P=l;M=T+c*(s&&M>T?1:-1),o=C+r*_.cos(M),l=A+i*_.sin(M),d=Bt(o,l,r,i,n,0,s,L,P,[M,N,C,A])}E=M-T;var z=_.cos(T),F=_.sin(T),R=_.cos(M),j=_.sin(M),I=_.tan(E/4),D=4/3*r*I,q=4/3*i*I,O=[t,e],V=[t+D*F,e-q*z],Y=[o+D*j,l-q*R],W=[o,l];if(V[0]=2*O[0]-V[0],V[1]=2*O[1]-V[1],h)return[V,Y,W][f](d);for(var G=[],H=0,X=(d=[V,Y,W][f](d).join()[v](",")).length;H"1e12"&&(p=.5),B(d)>"1e12"&&(d=.5),p>0&&p<1&&(l=Ct(t,e,r,i,n,a,s,o,p),x.push(l.x),g.push(l.y)),d>0&&d<1&&(l=Ct(t,e,r,i,n,a,s,o,d),x.push(l.x),g.push(l.y)),h=a-2*i+e-(o-2*a+i),f=e-i,p=(-(u=2*(i-e)-2*(a-i))+_.sqrt(u*u-4*h*f))/2/h,d=(-u-_.sqrt(u*u-4*h*f))/2/h,B(p)>"1e12"&&(p=.5),B(d)>"1e12"&&(d=.5),p>0&&p<1&&(l=Ct(t,e,r,i,n,a,s,o,p),x.push(l.x),g.push(l.y)),d>0&&d<1&&(l=Ct(t,e,r,i,n,a,s,o,d),x.push(l.x),g.push(l.y)),{min:{x:k[c](0,x),y:k[c](0,g)},max:{x:w[c](0,x),y:w[c](0,g)}}}),At=e._path2curve=ht(function(t,e){var r=!e&&ft(t);if(!e&&r.curve)return mt(r.curve);for(var i=_t(t),n=e&&_t(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=function(t,e,r){var i,n;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][f](Bt[c](0,[e.x,e.y][f](t.slice(1))));break;case"S":"C"==r||"S"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=["C",i,n][f](t.slice(1));break;case"T":"Q"==r||"T"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"][f](kt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][f](kt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][f](wt(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][f](wt(e.x,e.y,t[1],e.y));break;case"V":t=["C"][f](wt(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][f](wt(e.x,e.y,e.X,e.Y))}return t},l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]="A",n&&(p[e]="A"),t.splice(e++,0,["C"][f](r.splice(0,6)));t.splice(e,1),v=w(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],v=w(i.length,n&&n.length||0))},u=[],p=[],d="",g="",x=0,v=w(i.length,n&&n.length||0);x.01;)u/=2,h=dt(t,e,r,i,n,a,s,o,c+=(hn){if(r&&!f.start){if(c+=["C"+(u=Xt(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p)).start.x,u.start.y,u.m.x,u.m.y,u.x,u.y],a)return c;f.start=c,c=["M"+u.x,u.y+"C"+u.n.x,u.n.y,u.end.x,u.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return{x:(u=Xt(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p)).x,y:u.y,alpha:u.alpha}}p+=h,s=+l[5],o=+l[6]}c+=l.shift()+l}return f.end=c,(u=t?p:r?f:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1)).alpha&&(u={x:u.x,y:u.y,alpha:u.alpha}),u}},$t=Ut(1),Zt=Ut(),Qt=Ut(0,1);e.getTotalLength=$t,e.getPointAtLength=Zt,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Qt(t,e).end;var i=Qt(t,r,1);return e?Qt(i,e).end:i},Yt.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():$t(t)},Yt.getPointAtLength=function(t){var e=this.getPath();if(e)return Zt(e,t)},Yt.getPath=function(){var t,r=e._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return r&&(t=r(this)),t},Yt.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Jt=e.easing_formulas={linear:function(t){return t},"<":function(t){return C(t,1.7)},">":function(t){return C(t,.48)},"<>":function(t){var e=.48-t/1.04,r=_.sqrt(.1734+e*e),i=r-e,n=-r-e,a=C(B(i),1/3)*(i<0?-1:1)+C(B(n),1/3)*(n<0?-1:1)+.5;return 3*(1-a)*a*a+a*a*a},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:C(2,-10*t)*_.sin(2*S*(t-.075)/.3)+1},bounce:function(t){var e=7.5625,r=2.75;return t<1/r?e*t*t:t<2/r?e*(t-=1.5/r)*t+.75:t<2.5/r?e*(t-=2.25/r)*t+.9375:e*(t-=2.625/r)*t+.984375}};Jt.easeIn=Jt["ease-in"]=Jt["<"],Jt.easeOut=Jt["ease-out"]=Jt[">"],Jt.easeInOut=Jt["ease-in-out"]=Jt["<>"],Jt["back-in"]=Jt.backIn,Jt["back-out"]=Jt.backOut;var Kt=[],te=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},ee=function(){for(var r=+new Date,i=0;i1&&!n.next){for(s in d)d[o](s)&&(y[s]=n.totalOrigin[s]);n.el.attr(y),ae(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&ae(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Kt.length&&te(ee)},re=function(t){return t>255?255:t<0?0:t};function ie(t,e,r,i,n,a){var s=3*e,o=3*(i-e)-s,l=1-s-o,h=3*r,u=3*(n-r)-h,c=1-h-u;function f(t){return((l*t+o)*t+s)*t}return function(t,e){var r=function(t,e){var r,i,n,a,h,u;for(n=t,u=0;u<8;u++){if(a=f(n)-t,B(a)i)return i;for(;ra?r=n:i=n,n=(i-r)/2+r}return n}(t,e);return((c*r+u)*r+h)*r}(t,1/(200*a))}function ne(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[o](n)&&(i[z(n)]=t[n],r.push(z(n)));r.sort(H)}this.anim=i,this.top=r[r.length-1],this.percents=r}function ae(r,i,a,s,l,h){a=z(a);var u,c,p,d,g,y,m=r.ms,b={},_={},w={};if(s)for(B=0,C=Kt.length;Bs*r.top){a=r.percents[B],g=r.percents[B-1]||0,m=m/r.top*(a-g),d=r.percents[B+1],u=r.anim[a];break}s&&i.attr(r.anim[r.percents[B]])}if(u){if(c)c.initstatus=s,c.start=new Date-c.ms*s;else{for(var S in u)if(u[o](S)&&(I[o](S)||i.paper.customAttributes[o](S)))switch(b[S]=i.attr(S),null==b[S]&&(b[S]=j[S]),_[S]=u[S],I[S]){case A:w[S]=(_[S]-b[S])/m;break;case"colour":b[S]=e.getRGB(b[S]);var T=e.getRGB(_[S]);w[S]={r:(T.r-b[S].r)/m,g:(T.g-b[S].g)/m,b:(T.b-b[S].b)/m};break;case"path":var M=At(b[S],_[S]),E=M[1];for(b[S]=M[0],w[S]=[],B=0,C=b[S].length;Bh&&(h=c)}!t[h+="%"].callback&&(t[h].callback=n)}return new ne(t,r)},Yt.animate=function(t,r,i,n){if(this.removed)return n&&n.call(this),this;var a=t instanceof ne?t:e.animation(t,r,i,n);return ae(a,this,a.percents[0],null,this.attr()),this},Yt.setTime=function(t,e){return t&&null!=e&&this.status(t,k(e,t.ms)/t.ms),this},Yt.status=function(t,e){var r,i,n=[],a=0;if(null!=e)return ae(t,this,-1,k(e,1)),this;for(r=Kt.length;a"));var U=H.getBoundingClientRect();A.W=g.w=(U.right-U.left)/100,A.H=g.h=(U.bottom-U.top)/100,A.X=g.x,A.Y=g.y+A.H/2,("x"in l||"y"in l)&&(A.path.v=t.format("m{0},{1}l{2},{1}",a(g.x*y),a(g.y*y),a(g.x*y)+1));for(var $=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,Q=$.length;Z.25&&(r=n.sqrt(.25-o(e-.5,2))*(2*(r>.5)-1)+.5),h=e+c+r),f})).split(/\s*\-\s*/),"linear"==l){var u=a.shift();if(u=-i(u),isNaN(u))return null}var p=t._parseDots(a);if(!p)return null;if(e=e.shape||e.node,p.length){e.removeChild(s),s.on=!0,s.method="none",s.color=p[0].color,s.color2=p[p.length-1].color;for(var d=[],g=0,x=p.length;g')}}catch(t){k=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n=e.width,a=e.x,s=e.y;if(!r)throw new Error("VML container not found.");var o=new t._Paper,l=o.canvas=t._g.doc.createElement("div"),h=l.style;return a=a||0,s=s||0,n=n||512,i=i||342,o.width=n,o.height=i,n==+n&&(n+="px"),i==+i&&(i+="px"),o.coordsize=216e5+c+216e5,o.coordorigin="0 0",o.span=t._g.doc.createElement("span"),o.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",l.appendChild(o.span),h.cssText=t.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",n,i),1==r?(t._g.doc.body.appendChild(l),h.left=a+"px",h.top=s+"px",h.position="absolute"):r.firstChild?r.insertBefore(l,r.firstChild):r.appendChild(l),o.renderfix=function(){},o},t.prototype.clear=function(){t.eve("raphael.clear",this),this.canvas.innerHTML=f,this.span=t._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){for(var e in t.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas),this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;return!0};var M=t.st;for(var E in T)T[e](E)&&!M[e](E)&&(M[E]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(E))}}.apply(e,i))||(t.exports=n)},function(t,e,r){var i,n;i=[r(0)],void 0===(n=function(t){if(!t||t.svg){var e="hasOwnProperty",r=String,i=parseFloat,n=parseInt,a=Math,s=a.max,o=a.abs,l=a.pow,h=/[, ]+/,u=t.eve,c="",f=" ",p="http://www.w3.org/1999/xlink",d={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},g={};t.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var x=function(i,n){if(n)for(var a in"string"==typeof i&&(i=x(i)),n)n[e](a)&&("xlink:"==a.substring(0,6)?i.setAttributeNS(p,a.substring(6),r(n[a])):i.setAttribute(a,r(n[a])));else(i=t._g.doc.createElementNS("http://www.w3.org/2000/svg",i)).style&&(i.style.webkitTapHighlightColor="rgba(0,0,0,0)");return i},v=function(e,n){var h="linear",u=e.id+n,f=.5,p=.5,d=e.node,g=e.paper,v=d.style,m=t._g.doc.getElementById(u);if(!m){if(n=(n=r(n).replace(t._radial_gradient,function(t,e,r){if(h="radial",e&&r){f=i(e);var n=2*((p=i(r))>.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c})).split(/\s*\-\s*/),"linear"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){m=x(h+"Gradient",{id:u}),e.gradient=m,x(m,"radial"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(m);for(var B=0,C=k.length;B1?P.opacity/100:P.opacity});case"stroke":P=t.getRGB(g),l.setAttribute(d,P.hex),"stroke"==d&&P[e]("opacity")&&x(l,{"stroke-opacity":P.opacity>1?P.opacity/100:P.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&b(i,i._.arrows.startString),"endString"in i._.arrows&&b(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g);break;case"opacity":u.gradient&&!u[e]("stroke-opacity")&&x(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){(z=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)))&&(F=z.getElementsByTagName("stop"),x(F[F.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var R=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}B(i,a),l.style.visibility=f},B=function(i,a){if("text"==i.type&&(a[e]("text")||a[e]("font")||a[e]("font-size")||a[e]("x")||a[e]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[e]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h,u=r(a.text).split("\n"),f=[],p=0,d=u.length;p1)for(var i=0,n=r.length;i 0) { - for (var i = 0; i < $scope.assignment.idm.candidateUsers.length; i++) { - $scope.popup.assignmentObject.idm.candidateUsers.push($scope.assignment.idm.candidateUsers[i]); - } - } - - if ($scope.assignment.idm.candidateGroups && $scope.assignment.idm.candidateGroups.length > 0) { - for (var i = 0; i < $scope.assignment.idm.candidateGroups.length; i++) { - $scope.popup.assignmentObject.idm.candidateGroups.push($scope.assignment.idm.candidateGroups[i]); - } - } - } - } - - //fill the static area - if ($scope.assignment.assignee) { - $scope.popup.assignmentObject.static.assignee = $scope.assignment.assignee; - } - - if ($scope.assignment.candidateUsers && $scope.assignment.candidateUsers.length > 0) { - for (var i = 0; i < $scope.assignment.candidateUsers.length; i++) { - $scope.popup.assignmentObject.static.candidateUsers.push($scope.assignment.candidateUsers[i]); - } - } - - if ($scope.assignment.candidateGroups && $scope.assignment.candidateGroups.length > 0) { - for (var i = 0; i < $scope.assignment.candidateGroups.length; i++) { - $scope.popup.assignmentObject.static.candidateGroups.push($scope.assignment.candidateGroups[i]); - } - } - - initStaticContextForEditing($scope); - - $scope.$watch('popup.groupFilter', function () { - $scope.updateGroupFilter(); - }); - - $scope.$watch('popup.filter', function() { - $scope.updateFilter(); - }); - - $scope.updateFilter = function() { - if ($scope.popup.oldFilter == undefined || $scope.popup.oldFilter != $scope.popup.filter) { - if (!$scope.popup.filter) { - $scope.popup.oldFilter = ''; - } else { - $scope.popup.oldFilter = $scope.popup.filter; - } - - if ($scope.popup.filter !== null && $scope.popup.filter !== undefined) { - UserService.getFilteredUsers($scope.popup.filter).then(function (result) { - var filteredUsers = []; - for (var i=0; i= 0 && $scope.popup.selectedIndex < users.length) { - user = users[$scope.popup.selectedIndex]; - } - } - - if (user) { - if ("user" == $scope.assignmentOption.id) { - $scope.popup.assignmentObject.idm.assignee = user; - } else if ("users" == $scope.assignmentOption.id) { - - // Only add if not yet part of candidate users - var found = false; - if ($scope.popup.assignmentObject.idm.candidateUsers) { - for (var i = 0; i < $scope.popup.assignmentObject.idm.candidateUsers.length; i++) { - if ($scope.popup.assignmentObject.idm.candidateUsers[i].id === user.id) { - found = true; - break; - } - } - } - - if (!found) { - $scope.addCandidateUser(user); - } - } - } - }; - - $scope.confirmEmail = function() { - if ("user" == $scope.assignmentOption.id) { - $scope.popup.assignmentObject.idm.assignee = {email: $scope.popup.email}; - } else if ("users" == $scope.assignmentOption.id) { - - // Only add if not yet part of candidate users - var found = false; - if ($scope.popup.assignmentObject.idm.candidateUsers) { - for (var i = 0; i < $scope.popup.assignmentObject.idm.candidateUsers.length; i++) { - - if ($scope.popup.assignmentObject.idm.candidateUsers[i].id) { - if ($scope.popup.assignmentObject.idm.candidateUsers[i].id === user.id) { - found = true; - break; - } - } else if ($scope.popup.assignmentObject.idm.candidateUsers[i].email) { - if ($scope.popup.assignmentObject.idm.candidateUsers[i].email === $scope.popup.email) { - found = true; - break; - } - } - } - } - - if (!found) { - $scope.addCandidateUser({email: $scope.popup.email}); - } - } - }; - - $scope.confirmGroup = function(group) { - if (!group) { - // Selection is done with keyboard, use selection index - var groups = $scope.popup.groupResults; - if ($scope.popup.selectedGroupIndex >= 0 && $scope.popup.selectedGroupIndex < groups.length) { - group = groups[$scope.popup.selectedGroupIndex]; - } - } - - if (group) { - // Only add if not yet part of candidate groups - var found = false; - if ($scope.popup.assignmentObject.idm.candidateGroups) { - for (var i = 0; i < $scope.popup.assignmentObject.idm.candidateGroups.length; i++) { - if ($scope.popup.assignmentObject.idm.candidateGroups[i].id === group.id) { - found = true; - break; - } - } - } - - if (!found) { - $scope.addCandidateGroup(group); - } - } - }; - - $scope.addCandidateUser = function(user) { - $scope.popup.assignmentObject.idm.candidateUsers.push(user); - }; - - $scope.removeCandidateUser = function(user) { - var users = $scope.popup.assignmentObject.idm.candidateUsers; - var indexToRemove = -1; - for (var i = 0; i < users.length; i++) { - if (user.id) { - if (user.id === users[i].id) { - indexToRemove = i; - break; - } - } else { - if (user.email === users[i].email) { - indexToRemove = i; - break; - } - } - } - if (indexToRemove >= 0) { - users.splice(indexToRemove, 1); - } - }; - - $scope.addCandidateGroup = function(group) { - $scope.popup.assignmentObject.idm.candidateGroups.push(group); - }; - - $scope.removeCandidateGroup = function(group) { - var groups = $scope.popup.assignmentObject.idm.candidateGroups; - var indexToRemove = -1; - for (var i = 0; i < groups.length; i++) { - if (group.id == groups[i].id) { - indexToRemove = i; - break; - } - } - if (indexToRemove >= 0) { - groups.splice(indexToRemove, 1); - } - }; - - $scope.resetSelection = function() { - if ($scope.popup.userResults && $scope.popup.userResults.length > 0) { - $scope.popup.selectedIndex = 0; - } else { - $scope.popup.selectedIndex = -1; - } - }; - - $scope.nextUser = function() { - var users = $scope.popup.userResults; - if (users && users.length > 0 && $scope.popup.selectedIndex < users.length -1) { - $scope.popup.selectedIndex += 1; - } - }; - - $scope.previousUser = function() { - var users = $scope.popup.userResults; - if (users && users.length > 0 && $scope.popup.selectedIndex > 0) { - $scope.popup.selectedIndex -= 1; - } - }; - - $scope.resetGroupSelection = function() { - if ($scope.popup.groupResults && $scope.popup.groupResults.length > 0) { - $scope.popup.selectedGroupIndex = 0; - } else { - $scope.popup.selectedGroupIndex = -1; - } - }; - - $scope.nextGroup = function() { - var groups = $scope.popup.groupResults; - if (groups && groups.length > 0 && $scope.popup.selectedGroupIndex < groups.length -1) { - $scope.popup.selectedGroupIndex += 1; - } - }; - - $scope.previousGroup = function() { - var groups = $scope.popup.groupResults; - if (groups && groups.length > 0 && $scope.popup.selectedGroupIndex > 0) { - $scope.popup.selectedGroupIndex -= 1; - } - }; - - $scope.removeAssignee = function() { - $scope.popup.assignmentObject.idm.assignee = undefined; - }; - - // Click handler for + button after enum value - $scope.addCandidateUserValue = function(index) { - $scope.popup.assignmentObject.static.candidateUsers.splice(index + 1, 0, {value: ''}); - }; - - // Click handler for - button after enum value - $scope.removeCandidateUserValue = function(index) { - $scope.popup.assignmentObject.static.candidateUsers.splice(index, 1); - }; - - // Click handler for + button after enum value - $scope.addCandidateGroupValue = function(index) { - $scope.popup.assignmentObject.static.candidateGroups.splice(index + 1, 0, {value: ''}); - }; - - // Click handler for - button after enum value - $scope.removeCandidateGroupValue = function(index) { - $scope.popup.assignmentObject.static.candidateGroups.splice(index, 1); - }; - - $scope.setSearchType = function() { - $scope.popup.assignmentObject.assignmentSourceType = 'search'; - }; - - $scope.allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape); - - $scope.save = function () { - - handleAssignmentInput($scope.popup.assignmentObject.static); - - $scope.assignment.type = $scope.popup.assignmentObject.type; - - if ('idm' === $scope.popup.assignmentObject.type) { // IDM - $scope.popup.assignmentObject.static = undefined; - - //Construct an IDM object to be saved to the process model. - var idm = {type: $scope.assignmentOption.id}; - if ('user' == idm.type) { - if ($scope.popup.assignmentObject.idm.assignee) { - idm.assignee = $scope.popup.assignmentObject.idm.assignee; - } - } else if ('users' == idm.type) { - if ($scope.popup.assignmentObject.idm.candidateUsers && $scope.popup.assignmentObject.idm.candidateUsers.length > 0) { - idm.candidateUsers = $scope.popup.assignmentObject.idm.candidateUsers; - } - } else if ('groups' == idm.type) { - if ($scope.popup.assignmentObject.idm.candidateGroups && $scope.popup.assignmentObject.idm.candidateGroups.length > 0) { - idm.candidateGroups = $scope.popup.assignmentObject.idm.candidateGroups; - } - } - $scope.assignment.idm = idm; - $scope.assignment.assignee = undefined; - $scope.assignment.candidateUsers = undefined; - $scope.assignment.candidateGroups = undefined; - - } - - if ('static' === $scope.popup.assignmentObject.type) { // IDM - $scope.popup.assignmentObject.idm = undefined; - $scope.assignment.idm = undefined; - $scope.assignment.assignee = $scope.popup.assignmentObject.static.assignee; - $scope.assignment.candidateUsers = $scope.popup.assignmentObject.static.candidateUsers; - $scope.assignment.candidateGroups = $scope.popup.assignmentObject.static.candidateGroups; - } - - $scope.property.value = {}; - $scope.property.value.assignment = $scope.assignment; - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - var handleAssignmentInput = function ($assignment) { - - function isEmptyString(value) { - return (value === undefined || value === null || value.trim().length === 0); - } - - if (isEmptyString($assignment.assignee)){ - $assignment.assignee = undefined; - } - var toRemoveIndexes; - var removedItems=0; - var i = 0; - if ($assignment.candidateUsers) { - toRemoveIndexes = []; - for (i = 0; i < $assignment.candidateUsers.length; i++) { - if (isEmptyString($assignment.candidateUsers[i].value)) { - toRemoveIndexes[toRemoveIndexes.length] = i; - } - } - - if (toRemoveIndexes.length == $assignment.candidateUsers.length) { - $assignment.candidateUsers = undefined; - } else { - removedItems=0; - for (i = 0; i < toRemoveIndexes.length; i++) { - $assignment.candidateUsers.splice(toRemoveIndexes[i]-removedItems, 1); - removedItems++; - } - } - } - - if ($assignment.candidateGroups) { - toRemoveIndexes = []; - for (i = 0; i < $assignment.candidateGroups.length; i++) { - if (isEmptyString($assignment.candidateGroups[i].value)) { - toRemoveIndexes[toRemoveIndexes.length] = i; - } - } - - if (toRemoveIndexes.length == $assignment.candidateGroups.length) { - $assignment.candidateGroups = undefined; - } else { - removedItems=0; - for (i = 0; i < toRemoveIndexes.length; i++) { - $assignment.candidateGroups.splice(toRemoveIndexes[i]-removedItems, 1); - removedItems++; - } - } - } - }; - - function initStaticContextForEditing($scope) { - if (!$scope.popup.assignmentObject.static.candidateUsers || $scope.popup.assignmentObject.static.candidateUsers.length==0) { - $scope.popup.assignmentObject.static.candidateUsers = [{value: ''}]; - } - if (!$scope.popup.assignmentObject.static.candidateGroups || $scope.popup.assignmentObject.static.candidateGroups.length==0) { - $scope.popup.assignmentObject.static.candidateGroups = [{value: ''}]; - } - } -}]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-calledelementtype-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-calledelementtype-controller.js deleted file mode 100644 index c07775ce..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-calledelementtype-controller.js +++ /dev/null @@ -1,28 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Call activity calledElement type property - */ - -angular.module('flowableModeler').controller('FlowableCalledElementTypeCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) - { - $scope.property.value = 'key'; - } - - $scope.calledElementTypeChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-case-reference-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-case-reference-controller.js deleted file mode 100644 index 8cfae86a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-case-reference-controller.js +++ /dev/null @@ -1,86 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableCaseReferenceCtrl', - [ '$scope', '$modal', '$http', function($scope, $modal, $http) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/case-reference-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableCaseReferencePopupCtrl', [ '$scope', '$http', 'editorManager', '$location', function($scope, $http, editorManager, $location) { - - $scope.state = {'loadingCases' : true, 'error' : false}; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Selecting/deselecting a case - $scope.selectCase = function(caseModel, $event) { - $event.stopPropagation(); - if ($scope.selectedCase && $scope.selectedCase.id && caseModel.id == $scope.selectedCase.id) { - // un-select the current selection - $scope.selectedCase = null; - } else { - $scope.selectedCase = caseModel; - } - }; - - $scope.open = function() { - if ($scope.selectedCase) { - $location.path("/editor/" + $scope.selectedCase.id); - } - }; - - // Saving the selected value - $scope.save = function() { - if ($scope.selectedCase) { - $scope.property.value = {'id' : $scope.selectedCase.id, 'name' : $scope.selectedCase.name, 'key': $scope.selectedCase.key}; - } else { - $scope.property.value = null; - } - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.loadCases = function() { - var modelMetaData = editorManager.getBaseModelData(); - $http.get(FLOWABLE.APP_URL.getCaseModelsUrl('?excludeId=' + modelMetaData.modelId)) - .success( - function(response) { - $scope.state.loadingCases = false; - $scope.state.caseError = false; - $scope.caseModels = response.data; - }) - .error( - function(data, status, headers, config) { - $scope.state.loadingCases = false; - $scope.state.caseError = true; - }); - }; - - if ($scope.property && $scope.property.value && $scope.property.value.id) { - $scope.selectedCase = $scope.property.value; - } - - $scope.loadCases(); -}]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-condition-expression-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-condition-expression-controller.js deleted file mode 100644 index 0ef677ea..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-condition-expression-controller.js +++ /dev/null @@ -1,59 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Condition expression - */ - -angular.module('flowableModeler').controller('FlowableConditionExpressionCtrl', [ '$scope', '$modal', function($scope, $modal) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/condition-expression-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableConditionExpressionPopupCtrl', - [ '$rootScope', '$scope', '$translate', 'FormBuilderService', function($rootScope, $scope, $translate, FormBuilderService) { - - // Put json representing assignment on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.expression !== undefined - && $scope.property.value.expression !== null) { - - $scope.expression = $scope.property.value.expression; - - } else if ($scope.property.value !== undefined && $scope.property.value !== null) { - $scope.expression = {type: 'static', staticValue: $scope.property.value}; - - } else { - $scope.expression = {}; - } - - $scope.save = function() { - $scope.property.value = {expression: $scope.expression}; - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-custom-controllers.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-custom-controllers.js deleted file mode 100644 index 72ac3040..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-custom-controllers.js +++ /dev/null @@ -1,12 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-data-properties-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-data-properties-controller.js deleted file mode 100644 index 547bd30f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-data-properties-controller.js +++ /dev/null @@ -1,330 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Data Properties - */ - -angular.module('flowableModeler').controller('FlowableDataPropertiesCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/data-properties-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableDataPropertiesPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing data properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.items !== undefined - && $scope.property.value.items !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.dataProperties = angular.copy($scope.property.value.items); - - for (var i = 0; i < $scope.dataProperties.length; i++) { - var dataProperty = $scope.dataProperties[i]; - if (dataProperty.enumValues && dataProperty.enumValues.length > 0) { - for (var j = 0; j < dataProperty.enumValues.length; j++) { - var enumValue = dataProperty.enumValues[j]; - if (!enumValue.id && !enumValue.name && enumValue.value) { - enumValue.id = enumValue.value; - enumValue.name = enumValue.value; - } - } - } - } - - } else { - $scope.dataProperties = []; - } - - $scope.enumValues = []; - - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var idPromise = $translate('PROPERTY.DATAPROPERTIES.ID'); - var namePromise = $translate('PROPERTY.DATAPROPERTIES.NAME'); - var typePromise = $translate('PROPERTY.DATAPROPERTIES.TYPE'); - var valuePromise = $translate('PROPERTY.DATAPROPERTIES.VALUE'); - - $q.all([idPromise, namePromise, typePromise, valuePromise]).then(function (results) { - $scope.labels.idLabel = results[0]; - $scope.labels.nameLabel = results[1]; - $scope.labels.typeLabel = results[2]; - $scope.labels.valueLabel = results[3]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.dataProperties, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'dataproperty_id', displayName: $scope.labels.idLabel}, - {field: 'dataproperty_name', displayName: $scope.labels.nameLabel}, - {field: 'dataproperty_type', displayName: $scope.labels.typeLabel}, - {field: 'dataproperty_value', displayName: $scope.labels.valueLabel}] - }; - - $scope.enumGridOptions = { - data: $scope.enumValues, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{ field: 'id', displayName: $scope.labels.idLabel }, - { field: 'name', displayName: $scope.labels.nameLabel}] - } - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedProperty = row.entity; - $scope.selectedEnumValue = undefined; - if ($scope.selectedProperty && $scope.selectedProperty.enumValues) { - $scope.enumValues.length = 0; - for (var i = 0; i < $scope.selectedProperty.enumValues.length; i++) { - $scope.enumValues.push($scope.selectedProperty.enumValues[i]); - } - } - }); - }; - - $scope.enumGridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.enumGridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedEnumValue = row.entity; - }); - }; - }); - - // Handler for when the value of the type dropdown changes - $scope.propertyTypeChanged = function () { - - // Check date. If date, show date pattern - if ($scope.selectedProperty.type === 'date') { - $scope.selectedProperty.datePattern = 'MM-dd-yyyy hh:mm'; - } else { - delete $scope.selectedProperty.datePattern; - } - - // Check enum. If enum, show list of options - if ($scope.selectedProperty.type === 'enum') { - $scope.selectedProperty.enumValues = [ {id: 'value1', name: 'Value 1'}, {id: 'value2', name: 'Value 2'}]; - $scope.enumValues.length = 0; - for (var i = 0; i < $scope.selectedProperty.enumValues.length; i++) { - $scope.enumValues.push($scope.selectedProperty.enumValues[i]); - } - - } else { - delete $scope.selectedProperty.enumValues; - $scope.enumValues.length = 0; - } - }; - - // Click handler for add button - var propertyIndex = 1; - $scope.addNewProperty = function () { - var newProperty = { - dataproperty_id: 'new_data_object_' + propertyIndex++, - dataproperty_name: '', - dataproperty_type: 'string', - readable: true, - writable: true - }; - - $scope.dataProperties.push(newProperty); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newProperty); - }); - }; - - // Click handler for remove button - $scope.removeProperty = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.dataProperties.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.dataProperties.splice(index, 1); - - if ($scope.dataProperties.length == 0) { - $scope.selectedProperty = undefined; - } - - $timeout(function() { - if ($scope.dataProperties.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.dataProperties[0]); - } - }); - } - }; - - // Click handler for up button - $scope.movePropertyUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.dataProperties.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.dataProperties[index]; - $scope.dataProperties.splice(index, 1); - $timeout(function(){ - $scope.dataProperties.splice(index + -1, 0, temp); - $timeout(function() { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.movePropertyDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.dataProperties.indexOf(selectedItems[0]); - if (index != $scope.dataProperties.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.dataProperties[index]; - $scope.dataProperties.splice(index, 1); - $timeout(function(){ - $scope.dataProperties.splice(index + 1, 0, temp); - $timeout(function() { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - $scope.addNewEnumValue = function() { - if ($scope.selectedProperty) { - var newEnumValue = { id : '', name : ''}; - $scope.selectedProperty.enumValues.push(newEnumValue); - $scope.enumValues.push(newEnumValue); - - $timeout(function () { - $scope.enumGridApi.selection.toggleRowSelection(newEnumValue); - }); - } - }; - - // Click handler for remove button - $scope.removeEnumValue = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.enumValues.indexOf(selectedItems[0]); - $scope.enumGridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.enumValues.splice(index, 1); - $scope.selectedProperty.enumValues.splice(index, 1); - - if ($scope.enumValues.length == 0) { - $scope.selectedEnumValue = undefined; - } - - $timeout(function () { - if ($scope.enumValues.length > 0) { - $scope.enumGridApi.selection.toggleRowSelection($scope.enumValues[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveEnumValueUp = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.enumValues.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.enumValues[index]; - $scope.enumValues.splice(index, 1); - $scope.selectedProperty.enumValues.splice(index, 1); - $timeout(function () { - $scope.enumValues.splice(index + -1, 0, temp); - $scope.selectedProperty.enumValues.splice(index + -1, 0, temp); - $timeout(function () { - $scope.enumGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveEnumValueDown = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.enumValues.indexOf(selectedItems[0]); - if (index != $scope.enumValues.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.enumValues[index]; - $scope.enumValues.splice(index, 1); - $scope.selectedProperty.enumValues.splice(index, 1); - $timeout(function () { - $scope.enumValues.splice(index + 1, 0, temp); - $scope.selectedProperty.enumValues.splice(index + 1, 0, temp); - $timeout(function () { - $scope.enumGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.dataProperties.length > 0) { - $scope.property.value = {}; - $scope.property.value.items = $scope.dataProperties; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.$hide(); - $scope.property.mode = 'read'; - }; - - // Close button handler - $scope.close = function () { - $scope.$hide(); - $scope.property.mode = 'read'; - }; - - }]) -; \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-decisionservice-reference-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-decisionservice-reference-controller.js deleted file mode 100644 index 9e1fc38d..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-decisionservice-reference-controller.js +++ /dev/null @@ -1,288 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableDecisionServiceReferenceCtrl', - [ '$scope', '$modal', '$http', function($scope, $modal, $http) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/decisionservice-reference-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableDecisionServiceReferencePopupCtrl', ['$rootScope', '$scope', '$http', '$location', 'editorManager', - function($rootScope, $scope, $http, $location, editorManager) { - - $scope.state = { - 'loadingDecisionServices': true, - 'decisionServiceError': false - }; - - $scope.popup = { - 'state': 'decisionServiceReference' - }; - - $scope.foldersBreadCrumbs = []; - - // Make click outside dialog also call close. - $scope.$parent.$on('modal.hide.before', function() { - $scope.close(); - $scope.$parent.$apply(); - }); - - // Close button handler - $scope.close = function() { - $scope.property.newVariablesMapping = undefined; - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Selecting/deselecting a decision service - $scope.selectDecisionService = function(decisionService, $event) { - $event.stopPropagation(); - if ($scope.selectedDecisionService && $scope.selectedDecisionService.id && decisionService.id == $scope.selectedDecisionService.id) { - // un-select the current selection - $scope.selectedDecisionService = null; - } else { - $scope.selectedDecisionService = decisionService; - } - }; - - $scope.isSelected = function () { - if ($scope.selectedDecisionService && $scope.selectedDecisionService.id) { - return true; - } - return false; - }; - - // Saving the selected value - $scope.save = function() { - if ($scope.selectedDecisionService) { - $scope.property.value = { - 'id': $scope.selectedDecisionService.id, - 'name': $scope.selectedDecisionService.name, - 'key': $scope.selectedDecisionService.key - }; - - } else { - $scope.property.value = null; - } - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Open the selected value - $scope.open = function() { - if ($scope.selectedDecisionService) { - $scope.property.value = { - 'id': $scope.selectedDecisionService.id, - 'name': $scope.selectedDecisionService.name, - 'key': $scope.selectedDecisionService.key - }; - $scope.updatePropertyInModel($scope.property); - - var modelMetaData = editorManager.getBaseModelData(); - var json = editorManager.getModel(); - json = JSON.stringify(json); - - var params = { - modeltype: modelMetaData.model.modelType, - json_xml: json, - name: modelMetaData.name, - key: modelMetaData.key, - description: modelMetaData.description, - newversion: false, - lastUpdated: modelMetaData.lastUpdated - }; - - // Update - $http({ - method: 'POST', - data: params, - ignoreErrors: true, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - transformRequest: function (obj) { - var str = []; - for (var p in obj) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); - } - return str.join("&"); - }, - url: FLOWABLE.URL.putModel(modelMetaData.modelId) - }) - - .success(function(data, status, headers, config) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_SAVED - }); - - $rootScope.addHistoryItem($scope.selectedShape.resourceId); - $location.path('decision-service-editor/' + $scope.selectedDecisionService.id); - }) - .error(function(data, status, headers, config) { - - }); - - $scope.close(); - } - }; - - $scope.newDecisionService = function() { - $scope.property.value.variablesmapping = []; - - $scope.popup.state = 'newDecisionService'; - - var modelMetaData = editorManager.getBaseModelData(); - - $scope.model = { - loading: false, - decisionService: { - name: '', - key: '', - description: '', - modelType: 6 - }, - defaultStencilSet: undefined, - decisionTableStencilSets: [] - }; - }; - - $scope.createDecisionService = function() { - - if (!$scope.model.decisionService.name || $scope.model.decisionService.name.length == 0 || - !$scope.model.decisionService.key || $scope.model.decisionService.key.length == 0) { - - return; - } - - var stencilSetId = $scope.model.decisionService.stencilSet; - $scope.model.loading = true; - - $http({ - method: 'POST', - url: FLOWABLE.APP_URL.getModelsUrl(), - data: $scope.model.decisionService - }). - success(function(data, status, headers, config) { - - var newDecisionTableId = data.id; - $scope.property.value = { - 'id': newDecisionTableId, - 'name': data.name, - 'key': data.key - }; - $scope.updatePropertyInModel($scope.property); - - var modelMetaData = editorManager.getBaseModelData(); - var json = editorManager.getModel(); - json = JSON.stringify(json); - - var params = { - modeltype: modelMetaData.model.modelType, - json_xml: json, - name: modelMetaData.name, - key: modelMetaData.key, - description: modelMetaData.description, - newversion: false, - lastUpdated: modelMetaData.lastUpdated, - stencilSet: stencilSetId - }; - - // Update - $http({ - method: 'POST', - data: params, - ignoreErrors: true, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - transformRequest: function (obj) { - var str = []; - for (var p in obj) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); - } - return str.join("&"); - }, - url: FLOWABLE.URL.putModel(modelMetaData.modelId) - }) - - .success(function(data, status, headers, config) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_SAVED - }); - - $scope.model.loading = false; - $scope.$hide(); - - $rootScope.addHistoryItem($scope.selectedShape.resourceId); - $location.path('decision-service-editor/' + newDecisionTableId); - }) - .error(function(data, status, headers, config) { - $scope.model.loading = false; - $scope.$hide(); - }); - - }). - error(function(data, status, headers, config) { - $scope.model.loading = false; - $scope.model.errorMessage = data.message; - }); - }; - - $scope.cancel = function() { - $scope.close(); - }; - - $scope.resetCurrent = function () { - for (var i = 0, found = false; i < $scope.decisionServices.length && found === false; i++) { - var decision = $scope.decisionServices[i]; - if (decision.id === $scope.property.value.id) { - $scope.selectedDecisionService = decision; - found = true; - } - } - }; - - $scope.loadDecisionServices = function() { - var modelMetaData = editorManager.getBaseModelData(); - $http.get(FLOWABLE.APP_URL.getDecisionServiceModelsUrl()) - .success( - function(response) { - $scope.state.loadingDecisionServices = false; - $scope.state.decisionServiceError = false; - $scope.decisionServices = response.data; - $scope.resetCurrent(); - }) - .error( - function(data, status, headers, config) { - $scope.state.loadingDecisionServices = false; - $scope.state.decisionServiceError = true; - }); - }; - - if ($scope.property && $scope.property.value && $scope.property.value.id) { - $scope.selectedDecisionService = $scope.property.value; - $scope.storedId = $scope.property.value.id; - } - - $scope.loadDecisionServices(); - } -]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-decisiontable-reference-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-decisiontable-reference-controller.js deleted file mode 100644 index c795971e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-decisiontable-reference-controller.js +++ /dev/null @@ -1,288 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableDecisionTableReferenceCtrl', - [ '$scope', '$modal', '$http', function($scope, $modal, $http) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/decisiontable-reference-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableDecisionTableReferencePopupCtrl', ['$rootScope', '$scope', '$http', '$location', 'editorManager', - function($rootScope, $scope, $http, $location, editorManager) { - - $scope.state = { - 'loadingDecisionTables': true, - 'decisionTableError': false - }; - - $scope.popup = { - 'state': 'decisionTableReference' - }; - - $scope.foldersBreadCrumbs = []; - - // Make click outside dialog also call close. - $scope.$parent.$on('modal.hide.before', function() { - $scope.close(); - $scope.$parent.$apply(); - }); - - // Close button handler - $scope.close = function() { - $scope.property.newVariablesMapping = undefined; - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Selecting/deselecting a decision table - $scope.selectDecisionTable = function(decisionTable, $event) { - $event.stopPropagation(); - if ($scope.selectedDecisionTable && $scope.selectedDecisionTable.id && decisionTable.id == $scope.selectedDecisionTable.id) { - // un-select the current selection - $scope.selectedDecisionTable = null; - } else { - $scope.selectedDecisionTable = decisionTable; - } - }; - - $scope.isSelected = function () { - if ($scope.selectedDecisionTable && $scope.selectedDecisionTable.id) { - return true; - } - return false; - }; - - // Saving the selected value - $scope.save = function() { - if ($scope.selectedDecisionTable) { - $scope.property.value = { - 'id': $scope.selectedDecisionTable.id, - 'name': $scope.selectedDecisionTable.name, - 'key': $scope.selectedDecisionTable.key - }; - - } else { - $scope.property.value = null; - } - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Open the selected value - $scope.open = function() { - if ($scope.selectedDecisionTable) { - $scope.property.value = { - 'id': $scope.selectedDecisionTable.id, - 'name': $scope.selectedDecisionTable.name, - 'key': $scope.selectedDecisionTable.key - }; - $scope.updatePropertyInModel($scope.property); - - var modelMetaData = editorManager.getBaseModelData(); - var json = editorManager.getModel(); - json = JSON.stringify(json); - - var params = { - modeltype: modelMetaData.model.modelType, - json_xml: json, - name: modelMetaData.name, - key: modelMetaData.key, - description: modelMetaData.description, - newversion: false, - lastUpdated: modelMetaData.lastUpdated - }; - - // Update - $http({ - method: 'POST', - data: params, - ignoreErrors: true, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - transformRequest: function (obj) { - var str = []; - for (var p in obj) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); - } - return str.join("&"); - }, - url: FLOWABLE.URL.putModel(modelMetaData.modelId) - }) - - .success(function(data, status, headers, config) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_SAVED - }); - - $rootScope.addHistoryItem($scope.selectedShape.resourceId); - $location.path('decision-table-editor/' + $scope.selectedDecisionTable.id); - }) - .error(function(data, status, headers, config) { - - }); - - $scope.close(); - } - }; - - $scope.newDecisionTable = function() { - $scope.property.value.variablesmapping = []; - - $scope.popup.state = 'newDecisionTable'; - - var modelMetaData = editorManager.getBaseModelData(); - - $scope.model = { - loading: false, - decisionTable: { - name: '', - key: '', - description: '', - modelType: 4 - }, - defaultStencilSet: undefined, - decisionTableStencilSets: [] - }; - }; - - $scope.createDecisionTable = function() { - - if (!$scope.model.decisionTable.name || $scope.model.decisionTable.name.length == 0 || - !$scope.model.decisionTable.key || $scope.model.decisionTable.key.length == 0) { - - return; - } - - var stencilSetId = $scope.model.decisionTable.stencilSet; - $scope.model.loading = true; - - $http({ - method: 'POST', - url: FLOWABLE.APP_URL.getModelsUrl(), - data: $scope.model.decisionTable - }). - success(function(data, status, headers, config) { - - var newDecisionTableId = data.id; - $scope.property.value = { - 'id': newDecisionTableId, - 'name': data.name, - 'key': data.key - }; - $scope.updatePropertyInModel($scope.property); - - var modelMetaData = editorManager.getBaseModelData(); - var json = editorManager.getModel(); - json = JSON.stringify(json); - - var params = { - modeltype: modelMetaData.model.modelType, - json_xml: json, - name: modelMetaData.name, - key: modelMetaData.key, - description: modelMetaData.description, - newversion: false, - lastUpdated: modelMetaData.lastUpdated, - stencilSet: stencilSetId - }; - - // Update - $http({ - method: 'POST', - data: params, - ignoreErrors: true, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' - }, - transformRequest: function (obj) { - var str = []; - for (var p in obj) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); - } - return str.join("&"); - }, - url: FLOWABLE.URL.putModel(modelMetaData.modelId) - }) - - .success(function(data, status, headers, config) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_SAVED - }); - - $scope.model.loading = false; - $scope.$hide(); - - $rootScope.addHistoryItem($scope.selectedShape.resourceId); - $location.path('decision-table-editor/' + newDecisionTableId); - }) - .error(function(data, status, headers, config) { - $scope.model.loading = false; - $scope.$hide(); - }); - - }). - error(function(data, status, headers, config) { - $scope.model.loading = false; - $scope.model.errorMessage = data.message; - }); - }; - - $scope.cancel = function() { - $scope.close(); - }; - - $scope.resetCurrent = function () { - for (var i = 0, found = false; i < $scope.decisionTables.length && found === false; i++) { - var table = $scope.decisionTables[i]; - if (table.id === $scope.property.value.id) { - $scope.selectedDecisionTable = table; - found = true; - } - } - }; - - $scope.loadDecisionTables = function() { - var modelMetaData = editorManager.getBaseModelData(); - $http.get(FLOWABLE.APP_URL.getDecisionTableModelsUrl()) - .success( - function(response) { - $scope.state.loadingDecisionTables = false; - $scope.state.decisionTableError = false; - $scope.decisionTables = response.data; - $scope.resetCurrent(); - }) - .error( - function(data, status, headers, config) { - $scope.state.loadingDecisionTables = false; - $scope.state.decisionTableError = true; - }); - }; - - if ($scope.property && $scope.property.value && $scope.property.value.id) { - $scope.selectedDecisionTable = $scope.property.value; - $scope.storedId = $scope.property.value.id; - } - - $scope.loadDecisionTables(); - } -]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-default-controllers.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-default-controllers.js deleted file mode 100644 index c31fe4de..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-default-controllers.js +++ /dev/null @@ -1,118 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * String controller - */ - -angular.module('flowableModeler').controller('FlowableStringPropertyCtrl', [ '$scope', function ($scope) { - - $scope.shapeId = $scope.selectedShape.id; - $scope.valueFlushed = false; - /** Handler called when input field is blurred */ - $scope.inputBlurred = function() { - $scope.valueFlushed = true; - if ($scope.property.value) { - $scope.property.value = $scope.property.value.replace(/(<([^>]+)>)/ig,""); - } - $scope.updatePropertyInModel($scope.property); - }; - - $scope.enterPressed = function(keyEvent) { - // if enter is pressed - if (keyEvent && keyEvent.which === 13) { - keyEvent.preventDefault(); - $scope.inputBlurred(); // we want to do the same as if the user would blur the input field - } - // else; do nothing - }; - - $scope.$on('$destroy', function controllerDestroyed() { - if(!$scope.valueFlushed) { - if ($scope.property.value) { - $scope.property.value = $scope.property.value.replace(/(<([^>]+)>)/ig,""); - } - $scope.updatePropertyInModel($scope.property, $scope.shapeId); - } - }); - -}]); - -/* - * Boolean controller - */ - -angular.module('flowableModeler').controller('FlowableBooleanPropertyCtrl', ['$scope', function ($scope) { - - $scope.changeValue = function() { - if ($scope.property.key === 'oryx-defaultflow' && $scope.property.value) { - var selectedShape = $scope.selectedShape; - if (selectedShape) { - var incomingNodes = selectedShape.getIncomingShapes(); - if (incomingNodes && incomingNodes.length > 0) { - // get first node, since there can be only one for a sequence flow - var rootNode = incomingNodes[0]; - var flows = rootNode.getOutgoingShapes(); - if (flows && flows.length > 1) { - // in case there are more flows, check if another flow is already defined as default - for (var i = 0; i < flows.length; i++) { - if (flows[i].resourceId != selectedShape.resourceId) { - var defaultFlowProp = flows[i].properties.get('oryx-defaultflow'); - if (defaultFlowProp) { - flows[i].setProperty('oryx-defaultflow', false, true); - } - } - } - } - } - } - } - $scope.updatePropertyInModel($scope.property); - }; - -}]); - -/* - * Text controller - */ - -angular.module('flowableModeler').controller('FlowableTextPropertyCtrl', [ '$scope', '$modal', '$timeout', function($scope, $modal, $timeout) { - - var opts = { - template: 'editor-app/configuration/properties/text-popup.html?version=' + Date.now(), - scope: $scope, - prefixEvent: 'textModalEvent' - }; - - $scope.$on('textModalEvent.hide.before', function() { - $timeout(function() { - $scope.property.mode = 'read'; - }, 0); - }); - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableTextPropertyPopupCtrl', ['$scope', function($scope) { - - $scope.save = function() { - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-duedate-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-duedate-controller.js deleted file mode 100644 index 50ff9dd9..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-duedate-controller.js +++ /dev/null @@ -1,126 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Due date - */ -'use strict'; - -angular.module('flowableModeler').controller('BpmnEditorDueDateCtrl', [ '$scope', '$modal', function($scope, $modal) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/duedate-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('BpmnEditorDueDatePopupCtrl', - [ '$rootScope', '$scope', '$translate', function($rootScope, $scope, $translate) { - - // Put json representing assignment on scope - if ($scope.property.value !== undefined && $scope.property.value !== null) { - - if ($scope.property.value.duedate !== undefined && $scope.property.value.duedate !== null) { - $scope.popup = {'duedate': $scope.property.value.duedate}; - - } else if ($scope.property.value.duedateExpression !== undefined && $scope.property.value.duedateExpression !== null) { - $scope.popup = {'duedateExpression': $scope.property.value.duedateExpression}; - - } else { - $scope.popup = {'duedateExpression': $scope.property.value}; - } - - } else { - $scope.popup = {}; - } - - $scope.taskDueDateOptions = [ - {id: "none", title: $translate.instant('PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE')}, - {id: "expression", title: $translate.instant('PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION')}, - {id: "static", title: $translate.instant('PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC')}, - {id: "field", title: $translate.instant('PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD')} - ]; - - if (!$scope.popup.duedate && !$scope.popup.duedateExpression) { - // Default, first time opening the popup - $scope.popup.selectedDueDateOption = $scope.taskDueDateOptions[0].id; - - } else if (!$scope.popup.duedate) { - $scope.popup.selectedDueDateOption = $scope.taskDueDateOptions[1].id; - - } else { - - if ($scope.popup.duedate.fixed) { - $scope.popup.selectedDueDateOption = $scope.taskDueDateOptions[2].id; - - } else if ($scope.popup.duedate.field) { - $scope.popup.selectedDueDateOption = $scope.taskDueDateOptions[3].id; - - } else { - $scope.popup.selectedDueDateOption = $scope.taskDueDateOptions[0].id; - } - } - - $scope.dueDateOptionChanged = function() { - if ($scope.popup.selectedDueDateOption === 'expression') { - $scope.popup.duedate = undefined; - - } else if ($scope.popup.selectedDueDateOption === 'none') { - $scope.popup.duedate = undefined; - $scope.popup.duedateExpression = undefined; - - } else if ($scope.popup.selectedDueDateOption === 'static') { - $scope.popup.duedate = {'fixed': {}}; - $scope.popup.duedateExpression = undefined; - - } else if ($scope.popup.selectedDueDateOption === 'field') { - $scope.popup.duedate = {'field': {}}; - $scope.popup.duedateExpression = undefined; - } - }; - - $scope.setAddCalculationType = function() { - $scope.popup.duedate.field.taskDueDateCalculationType = 'add'; - }; - - $scope.setSubtractCalculationType = function() { - $scope.popup.duedate.field.taskDueDateCalculationType = 'subtract'; - }; - - $scope.allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape); - - $scope.save = function () { - $scope.property.value = {}; - if ($scope.popup.duedate) { - $scope.property.value.duedate = $scope.popup.duedate; - - } else if ($scope.popup.duedateExpression) { - $scope.property.value.duedateExpression = $scope.popup.duedateExpression; - - } else { - $scope.property.value = ''; - } - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; -}]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-escalation-definitions-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-escalation-definitions-controller.js deleted file mode 100644 index 7944d0c5..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-escalation-definitions-controller.js +++ /dev/null @@ -1,145 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Escalation definitions - */ - -angular.module('flowableModeler').controller('FlowableEscalationDefinitionsCtrl', ['$scope', '$modal', function ($scope, $modal) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/escalation-definitions-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259 -// Will be fixed in a newer version of Angular UI -angular.module('flowableModeler').controller('FlowableEscalationDefinitionsPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing signal definitions on scope - if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.length > 0) { - - if ($scope.property.value.constructor == String) { - $scope.escalationDefinitions = JSON.parse($scope.property.value); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.escalationDefinitions = angular.copy($scope.property.value); - } - - } else { - $scope.escalationDefinitions = []; - } - - // Array to contain selected signal definitions (yes - we only can select one, but ng-grid isn't smart enough) - $scope.selectedEscalationDefinition = undefined; - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var idPromise = $translate('PROPERTY.ESCALATIONDEFINITIONS.ID'); - var namePromise = $translate('PROPERTY.ESCALATIONDEFINITIONS.NAME'); - - $q.all([idPromise, namePromise]).then(function (results) { - - $scope.labels.idLabel = results[0]; - $scope.labels.nameLabel = results[1]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.escalationDefinitions, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'id', displayName: $scope.labels.idLabel}, - {field: 'name', displayName: $scope.labels.nameLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedEscalationDefinition = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewEscalationDefinition = function () { - var newEscalationDefinition = {id: '', name: ''}; - - $scope.escalationDefinitions.push(newEscalationDefinition); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newEscalationDefinition); - }); - }; - - // Click handler for remove button - $scope.removeEscalationDefinition = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.escalationDefinitions.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.escalationDefinitions.splice(index, 1); - - if ($scope.escalationDefinitions.length == 0) { - $scope.selectedEscalationDefinition = undefined; - } - - $timeout(function () { - if ($scope.escalationDefinitions.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.escalationDefinitions[0]); - } - }); - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.escalationDefinitions.length > 0) { - $scope.property.value = $scope.escalationDefinitions; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-escalation-scope-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-escalation-scope-controller.js deleted file mode 100644 index 0a600153..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-escalation-scope-controller.js +++ /dev/null @@ -1,42 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableEscalationRefCtrl', [ '$scope', function($scope) { - - // Find the parent shape on which the signal definitions are defined - var escalationDefinitionsProperty = undefined; - var parent = $scope.selectedShape; - while (parent !== null && parent !== undefined && escalationDefinitionsProperty === undefined) { - if (parent.properties && parent.properties.get('oryx-escalationdefinitions')) { - escalationDefinitionsProperty = parent.properties.get('oryx-escalationdefinitions'); - } else { - parent = parent.parent; - } - } - - try { - escalationDefinitionsProperty = JSON.parse(escalationDefinitionsProperty); - if (typeof escalationDefinitionsProperty == 'string') { - escalationDefinitionsProperty = JSON.parse(escalationDefinitionsProperty); - } - } catch (err) { - // Do nothing here, just to be sure we try-catch it - } - - $scope.escalationDefinitions = escalationDefinitionsProperty; - - - $scope.escalationChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-channel-type-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-channel-type-controller.js deleted file mode 100644 index 827270ca..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-channel-type-controller.js +++ /dev/null @@ -1,24 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableEventRegistryChannelTypeCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) - { - $scope.property.value = 'None'; - } - - $scope.channelTypeChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-correlation-parameters-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-correlation-parameters-controller.js deleted file mode 100644 index 23ca4c90..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-correlation-parameters-controller.js +++ /dev/null @@ -1,141 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Input parameters for call activity - */ - -angular.module('flowableModeler').controller('FlowableEventCorrelationParametersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/event-correlation-parameters-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableEventCorrelationParametersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.correlationParameters !== undefined - && $scope.property.value.correlationParameters !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.parameters = angular.copy($scope.property.value.correlationParameters); - } else { - $scope.parameters = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var parameterName = $translate('PROPERTY.EVENTCORRELATIONPARAMETERS.NAME'); - var parameterType = $translate('PROPERTY.EVENTCORRELATIONPARAMETERS.TYPE'); - - $q.all([parameterName, parameterType]).then(function (results) { - $scope.labels.parameterName = results[0]; - $scope.labels.parameterType = results[1]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.parameters, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'name', displayName: $scope.labels.parameterName}, - {field: 'type', displayName: $scope.labels.parameterType}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedParameter = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewParameter = function () { - var newParameter = { - name: '', - type: 'string', - value: '' - }; - - $scope.parameters.push(newParameter); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newParameter); - }); - }; - - // Click handler for remove button - $scope.removeParameter = function () { - - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.parameters.splice(index, 1); - - if ($scope.parameters.length == 0) { - $scope.selectedParameter = undefined; - } - - $timeout(function () { - if ($scope.parameters.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.parameters[0]); - } - }); - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.parameters.length > 0) { - $scope.property.value = {}; - $scope.property.value.correlationParameters = $scope.parameters; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-in-parameters-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-in-parameters-controller.js deleted file mode 100644 index 828a7d46..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-in-parameters-controller.js +++ /dev/null @@ -1,141 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Input parameters for call activity - */ - -angular.module('flowableModeler').controller('FlowableEventInParametersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/event-in-parameters-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableEventInParametersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.inParameters !== undefined - && $scope.property.value.inParameters !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.parameters = angular.copy($scope.property.value.inParameters); - } else { - $scope.parameters = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var variableNameLabel = $translate('PROPERTY.EVENTINPARAMETERS.VARIABLENAME'); - var eventNameLabel = $translate('PROPERTY.EVENTINPARAMETERS.EVENTNAME'); - - $q.all([variableNameLabel, eventNameLabel]).then(function (results) { - $scope.labels.variableNameLabel = results[1]; - $scope.labels.eventNameLabel = results[0]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.parameters, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'variableName', displayName: $scope.labels.variableNameLabel}, - {field: 'eventName', displayName: $scope.labels.eventNameLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedParameter = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewParameter = function () { - var newParameter = { - variableName: '', - eventName: '', - eventType: 'string' - }; - - $scope.parameters.push(newParameter); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newParameter); - }); - }; - - // Click handler for remove button - $scope.removeParameter = function () { - - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.parameters.splice(index, 1); - - if ($scope.parameters.length == 0) { - $scope.selectedParameter = undefined; - } - - $timeout(function () { - if ($scope.parameters.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.parameters[0]); - } - }); - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.parameters.length > 0) { - $scope.property.value = {}; - $scope.property.value.inParameters = $scope.parameters; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-listeners-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-listeners-controller.js deleted file mode 100644 index 21f9ad4a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-listeners-controller.js +++ /dev/null @@ -1,263 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Execution listeners - */ - -angular.module('flowableModeler').controller('FlowableEventListenersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/event-listeners-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259 -// Will be fixed in a newer version of Angular UI -angular.module('flowableModeler').controller('FlowableEventListenersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.eventListeners !== undefined - && $scope.property.value.eventListeners !== null) { - - if ($scope.property.value.eventListeners.constructor == String) { - $scope.eventListeners = JSON.parse($scope.property.value.eventListeners); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.eventListeners = angular.copy($scope.property.value.eventListeners); - } - - } else { - $scope.eventListeners = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var eventPromise = $translate('PROPERTY.EXECUTIONLISTENERS.EVENT'); - var implementationPromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION'); - var namePromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME'); - - $q.all([eventPromise, implementationPromise, namePromise]).then(function (results) { - $scope.labels.eventLabel = results[0]; - $scope.labels.implementationLabel = results[1]; - $scope.labels.nameLabel = results[2]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.eventListeners, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'event', displayName: $scope.labels.eventLabel}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedListener = row.entity; - - if ($scope.selectedListener) { - var fields = $scope.selectedListener.fields; - if (fields !== undefined && fields !== null) { - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - if (field.stringValue !== undefined && field.stringValue !== '') { - field.implementation = field.stringValue; - } else if (field.expression !== undefined && field.expression !== '') { - field.implementation = field.expression; - } else if (field.string !== undefined && field.string !== '') { - field.implementation = field.string; - } - } - } else { - $scope.selectedListener.fields = []; - } - if (!$scope.selectedListener.events) { - $scope.selectedListener.events = [{event: ''}]; - } - } - }); - }; - }); - - - // Click handler for + button after enum value - $scope.addEventValue = function (index) { - $scope.selectedListener.events.splice(index + 1, 0, {event: ''}); - }; - - // Click handler for - button after enum value - $scope.removeEventValue = function (index) { - $scope.selectedListener.events.splice(index, 1); - $scope.listenerDetailsChanged(); - }; - - $scope.listenerDetailsChanged = function () { - var listener = $scope.selectedListener; - if (listener.events) { - var eventText = ''; - for (var i = 0; i < listener.events.length; i++) { - if (i > 0) { - eventText += ", "; - } - eventText += listener.events[i].event; - } - $scope.selectedListener.event = eventText; - } - - if (listener.rethrowEvent) { - var implementationText = ''; - if (listener.rethrowType && listener.rethrowType.length > 0) { - if (listener.rethrowType === 'error' && listener.errorcode !== '') { - implementationText = "Rethrow as error " + listener.errorcode; - } - else if (listener.rethrowType === 'message' && listener.messagename !== '') { - implementationText = "Rethrow as message " + listener.messagename; - } - else if ((listener.rethrowType === 'signal' || listener.rethrowType === 'globalSignal') && listener.signalname !== '') { - implementationText = "Rethrow as signal " + listener.signalname; - } - } - $scope.selectedListener.implementation = implementationText; - } - else { - if ($scope.selectedListener.className !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.className; - } - else if ($scope.selectedListener.delegateExpression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.delegateExpression; - } - else { - $scope.selectedListener.implementation = ''; - } - } - }; - - // Click handler for add button - $scope.addNewListener = function () { - var newListener = { - event: '', - implementation: '', - className: '', - delegateExpression: '', - retrowEvent: false - }; - - $scope.eventListeners.push(newListener); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newListener); - }); - }; - - // Click handler for remove button - $scope.removeListener = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.eventListeners.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.eventListeners.splice(index, 1); - - if ($scope.eventListeners.length == 0) { - $scope.selectedListener = undefined; - } - - $timeout(function () { - if ($scope.eventListeners.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.eventListeners[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveListenerUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.eventListeners.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.eventListeners[index]; - $scope.eventListeners.splice(index, 1); - $timeout(function () { - $scope.eventListeners.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveListenerDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.eventListeners.indexOf(selectedItems[0]); - if (index != $scope.eventListeners.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.eventListeners[index]; - $scope.eventListeners.splice(index, 1); - $timeout(function () { - $scope.eventListeners.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.eventListeners.length > 0) { - $scope.property.value = {}; - $scope.property.value.eventListeners = $scope.eventListeners; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-out-parameters-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-out-parameters-controller.js deleted file mode 100644 index 152f20d7..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-event-out-parameters-controller.js +++ /dev/null @@ -1,141 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Input parameters for call activity - */ - -angular.module('flowableModeler').controller('FlowableEventOutParametersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/event-out-parameters-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableEventOutParametersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.outParameters !== undefined - && $scope.property.value.outParameters !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.parameters = angular.copy($scope.property.value.outParameters); - } else { - $scope.parameters = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var eventNameLabel = $translate('PROPERTY.EVENTOUTPARAMETERS.EVENTNAME'); - var variableNameLabel = $translate('PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME'); - - $q.all([eventNameLabel, variableNameLabel]).then(function (results) { - $scope.labels.eventNameLabel = results[0]; - $scope.labels.variableNameLabel = results[1]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.parameters, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'eventName', displayName: $scope.labels.eventNameLabel}, - {field: 'variableName', displayName: $scope.labels.variableNameLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedParameter = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewParameter = function () { - var newParameter = { - eventName: '', - eventType: 'string', - variableName: '' - }; - - $scope.parameters.push(newParameter); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newParameter); - }); - }; - - // Click handler for remove button - $scope.removeParameter = function () { - - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.parameters.splice(index, 1); - - if ($scope.parameters.length == 0) { - $scope.selectedParameter = undefined; - } - - $timeout(function () { - if ($scope.parameters.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.parameters[0]); - } - }); - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.parameters.length > 0) { - $scope.property.value = {}; - $scope.property.value.outParameters = $scope.parameters; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-exceptions-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-exceptions-controller.js deleted file mode 100644 index da7498e8..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-exceptions-controller.js +++ /dev/null @@ -1,184 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Task listeners - */ - -angular.module('flowableModeler').controller('FlowableExceptionsCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/exceptions-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - - -angular.module('flowableModeler').controller('FlowableExceptionsPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.exceptions !== undefined - && $scope.property.value.exceptions !== null) { - - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.exceptions = angular.copy($scope.property.value.exceptions); - - } else { - $scope.exceptions = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var codePromise = $translate('PROPERTY.EXCEPTIONS.CODE'); - var classPromise = $translate('PROPERTY.EXCEPTIONS.CLASS'); - - $q.all([codePromise, classPromise]).then(function (results) { - $scope.labels.codeLabel = results[0]; - $scope.labels.classLabel = results[1]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.exceptions, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'code', displayName: $scope.labels.codeLabel}, - {field: 'class', displayName: $scope.labels.classLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedException = row.entity; - }); - }; - }); - - $scope.exceptionDetailsChanged = function () { - if ($scope.selectedException.class != '') { - $scope.selectedException.class = $scope.selectedException.class; - } - - }; - - // Click handler for add button - $scope.addNewException = function () { - var newException = { - code: '', - class: '', - children: false - }; - - $scope.exceptions.push(newException); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newException); - }); - }; - - // Click handler for remove button - $scope.removeException = function () { - - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.exceptions.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.exceptions.splice(index, 1); - - if ($scope.exceptions.length == 0) { - $scope.selectedException = undefined; - } - - $timeout(function () { - if ($scope.exceptions.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.exceptions[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveExceptionUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.exceptions.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.exceptions[index]; - $scope.exceptions.splice(index, 1); - $timeout(function () { - $scope.exceptions.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveExceptionDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.exceptions.indexOf(selectedItems[0]); - if (index != $scope.exceptions.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.exceptions[index]; - $scope.exceptions.splice(index, 1); - $timeout(function () { - $scope.exceptions.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.exceptions.length > 0) { - $scope.property.value = {}; - $scope.property.value.exceptions = $scope.exceptions; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.$hide(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - }]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-execution-listeners-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-execution-listeners-controller.js deleted file mode 100644 index 3ca1310b..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-execution-listeners-controller.js +++ /dev/null @@ -1,358 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Execution listeners - */ - -angular.module('flowableModeler').controller('FlowableExecutionListenersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/execution-listeners-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableExecutionListenersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.executionListeners !== undefined - && $scope.property.value.executionListeners !== null) { - - if ($scope.property.value.executionListeners.constructor == String) { - $scope.executionListeners = JSON.parse($scope.property.value.executionListeners); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.executionListeners = angular.copy($scope.property.value.executionListeners); - } - - for (var i = 0; i < $scope.executionListeners.length; i++) { - var executionListener = $scope.executionListeners[i]; - if (executionListener.className !== undefined && executionListener.className !== '') { - executionListener.implementation = executionListener.className; - } - else if (executionListener.expression !== undefined && executionListener.expression !== '') { - executionListener.implementation = executionListener.expression; - } - else if (executionListener.delegateExpression !== undefined && executionListener.delegateExpression !== '') { - executionListener.implementation = executionListener.delegateExpression; - } - } - } else { - $scope.executionListeners = []; - } - - $scope.selectedListener = undefined; - $scope.selectedField = undefined; - $scope.fields = []; - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var eventPromise = $translate('PROPERTY.EXECUTIONLISTENERS.EVENT'); - var implementationPromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION'); - var namePromise = $translate('PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME'); - - $q.all([eventPromise, implementationPromise, namePromise]).then(function (results) { - $scope.labels.eventLabel = results[0]; - $scope.labels.implementationLabel = results[1]; - $scope.labels.nameLabel = results[2]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.executionListeners, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'event', displayName: $scope.labels.eventLabel}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedListener = row.entity; - $scope.selectedField = undefined; - if ($scope.selectedListener) { - var fields = $scope.selectedListener.fields; - if (fields !== undefined && fields !== null) { - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - if (field.stringValue !== undefined && field.stringValue !== '') { - field.implementation = field.stringValue; - } else if (field.expression !== undefined && field.expression !== '') { - field.implementation = field.expression; - } else if (field.string !== undefined && field.string !== '') { - field.implementation = field.string; - } - } - } else { - $scope.selectedListener.fields = []; - } - - $scope.fields.length = 0; - for (var i = 0; i < $scope.selectedListener.fields.length; i++) { - $scope.fields.push($scope.selectedListener.fields[i]); - } - } - }); - }; - - // Config for field grid - $scope.gridFieldOptions = { - data: $scope.fields, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'name', displayName: $scope.labels.name}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridFieldOptions.onRegisterApi = function (gridApi) { - // set gridApi on scope - $scope.fieldGridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedField = row.entity; - }); - }; - }); - - $scope.listenerDetailsChanged = function () { - if ($scope.selectedListener.className !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.className; - } else if ($scope.selectedListener.expression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.expression; - } else if ($scope.selectedListener.delegateExpression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.delegateExpression; - } else { - $scope.selectedListener.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewListener = function () { - var newListener = { - event: 'start', - implementation: '', - className: '', - expression: '', - delegateExpression: '' - }; - $scope.executionListeners.push(newListener); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newListener); - }); - }; - - // Click handler for remove button - $scope.removeListener = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.executionListeners.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.executionListeners.splice(index, 1); - - if ($scope.executionListeners.length == 0) { - $scope.selectedListener = undefined; - } - - $timeout(function () { - if ($scope.executionListeners.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.executionListeners[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveListenerUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.executionListeners.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.executionListeners[index]; - $scope.executionListeners.splice(index, 1); - $timeout(function () { - $scope.executionListeners.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveListenerDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.executionListeners.indexOf(selectedItems[0]); - if (index != $scope.executionListeners.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.executionListeners[index]; - $scope.executionListeners.splice(index, 1); - $timeout(function () { - $scope.executionListeners.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - $scope.fieldDetailsChanged = function () { - if ($scope.selectedField.stringValue != '') { - $scope.selectedField.implementation = $scope.selectedField.stringValue; - } else if ($scope.selectedField.expression != '') { - $scope.selectedField.implementation = $scope.selectedField.expression; - } else if ($scope.selectedField.string != '') { - $scope.selectedField.implementation = $scope.selectedField.string; - } else { - $scope.selectedField.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewField = function () { - if ($scope.selectedListener) { - if ($scope.selectedListener.fields == undefined) { - $scope.selectedListener.fields = []; - } - - var newField = { - name: 'fieldName', - implementation: '', - stringValue: '', - expression: '', - string: '' - }; - $scope.fields.push(newField); - $scope.selectedListener.fields.push(newField); - - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(newField); - }); - } - }; - - // Click handler for remove button - $scope.removeField = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - $scope.fieldGridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - - if ($scope.fields.length == 0) { - $scope.selectedField = undefined; - } - - $timeout(function () { - if ($scope.fields.length > 0) { - $scope.fieldGridApi.selection.toggleRowSelection($scope.fields[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveFieldUp = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + -1, 0, temp); - $scope.selectedListener.fields.splice(index + -1, 0, temp); - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveFieldDown = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != $scope.fields.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + 1, 0, temp); - $scope.selectedListener.fields.splice(index + 1, 0, temp); - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.executionListeners.length > 0) { - $scope.property.value = {}; - $scope.property.value.executionListeners = $scope.executionListeners; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.$hide(); - $scope.property.mode = 'read'; - }; - - // Close button handler - $scope.close = function () { - $scope.$hide(); - $scope.property.mode = 'read'; - }; - - }]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-fields-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-fields-controller.js deleted file mode 100644 index 2d9445b7..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-fields-controller.js +++ /dev/null @@ -1,206 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Task listeners - */ - -angular.module('flowableModeler').controller('FlowableFieldsCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/fields-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableFieldsPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.fields !== undefined - && $scope.property.value.fields !== null) { - - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.fields = angular.copy($scope.property.value.fields); - - for (var i = 0; i < $scope.fields.length; i++) { - var field = $scope.fields[i]; - if (field.stringValue !== undefined && field.stringValue !== '') { - field.implementation = field.stringValue; - } - else if (field.expression !== undefined && field.expression !== '') { - field.implementation = field.expression; - } - else if (field.string !== undefined && field.string !== '') { - field.implementation = field.string; - } - } - - } else { - $scope.fields = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var namePromise = $translate('PROPERTY.FIELDS.NAME'); - var implementationPromise = $translate('PROPERTY.FIELDS.IMPLEMENTATION'); - - $q.all([namePromise, implementationPromise]).then(function (results) { - $scope.labels.nameLabel = results[0]; - $scope.labels.implementationLabel = results[1]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.fields, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'name', displayName: $scope.labels.nameLabel}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedField = row.entity; - }); - }; - }); - - $scope.fieldDetailsChanged = function () { - if ($scope.selectedField.stringValue != '') { - $scope.selectedField.implementation = $scope.selectedField.stringValue; - } - else if ($scope.selectedField.expression != '') { - $scope.selectedField.implementation = $scope.selectedField.expression; - } - else if ($scope.selectedField.string != '') { - $scope.selectedField.implementation = $scope.selectedField.string; - } - else { - $scope.selectedField.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewField = function () { - var newField = { - name: 'fieldName', - implementation: '', - stringValue: '', - expression: '', - string: '' - }; - - $scope.fields.push(newField); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newField); - }); - }; - - // Click handler for remove button - $scope.removeField = function () { - - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.fields.splice(index, 1); - - if ($scope.fields.length == 0) { - $scope.selectedField = undefined; - } - - $timeout(function () { - if ($scope.fields.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.fields[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveFieldUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveFieldDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != $scope.fields.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.fields.length > 0) { - $scope.property.value = {}; - $scope.property.value.fields = $scope.fields; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.$hide(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - }]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-form-properties-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-form-properties-controller.js deleted file mode 100644 index ca8f0510..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-form-properties-controller.js +++ /dev/null @@ -1,327 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Form Properties - */ - -angular.module('flowableModeler').controller('FlowableFormPropertiesCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/form-properties-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableFormPropertiesPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.formProperties !== undefined - && $scope.property.value.formProperties !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happended - $scope.formProperties = angular.copy($scope.property.value.formProperties); - - for (var i = 0; i < $scope.formProperties.length; i++) { - var formProperty = $scope.formProperties[i]; - if (formProperty.enumValues && formProperty.enumValues.length > 0) { - for (var j = 0; j < formProperty.enumValues.length; j++) { - var enumValue = formProperty.enumValues[j]; - if (!enumValue.id && !enumValue.name && enumValue.value) { - enumValue.id = enumValue.value; - enumValue.name = enumValue.value; - } - } - } - } - - } else { - $scope.formProperties = []; - } - - $scope.enumValues = []; - - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var idPromise = $translate('PROPERTY.FORMPROPERTIES.ID'); - var namePromise = $translate('PROPERTY.FORMPROPERTIES.NAME'); - var typePromise = $translate('PROPERTY.FORMPROPERTIES.TYPE'); - - $q.all([idPromise, namePromise, typePromise]).then(function (results) { - $scope.labels.idLabel = results[0]; - $scope.labels.nameLabel = results[1]; - $scope.labels.typeLabel = results[2]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.formProperties, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'id', displayName: $scope.labels.idLabel}, - {field: 'name', displayName: $scope.labels.nameLabel}, - {field: 'type', displayName: $scope.labels.typeLabel}] - }; - - $scope.enumGridOptions = { - data: $scope.enumValues, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{ field: 'id', displayName: $scope.labels.idLabel }, - { field: 'name', displayName: $scope.labels.nameLabel}] - } - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedProperty = row.entity; - $scope.selectedEnumValue = undefined; - if ($scope.selectedProperty && $scope.selectedProperty.enumValues) { - $scope.enumValues.length = 0; - for (var i = 0; i < $scope.selectedProperty.enumValues.length; i++) { - $scope.enumValues.push($scope.selectedProperty.enumValues[i]); - } - } - }); - }; - - $scope.enumGridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.enumGridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedEnumValue = row.entity; - }); - }; - }); - - // Handler for when the value of the type dropdown changes - $scope.propertyTypeChanged = function () { - - // Check date. If date, show date pattern - if ($scope.selectedProperty.type === 'date') { - $scope.selectedProperty.datePattern = 'MM-dd-yyyy hh:mm'; - } else { - delete $scope.selectedProperty.datePattern; - } - - // Check enum. If enum, show list of options - if ($scope.selectedProperty.type === 'enum') { - $scope.selectedProperty.enumValues = [ {id: 'value1', name: 'Value 1'}, {id: 'value2', name: 'Value 2'}]; - $scope.enumValues.length = 0; - for (var i = 0; i < $scope.selectedProperty.enumValues.length; i++) { - $scope.enumValues.push($scope.selectedProperty.enumValues[i]); - } - - } else { - delete $scope.selectedProperty.enumValues; - $scope.enumValues.length = 0; - } - }; - - // Click handler for add button - var propertyIndex = 1; - $scope.addNewProperty = function () { - var newProperty = { - id: 'new_property_' + propertyIndex++, - name: '', - type: 'string', - readable: true, - writable: true - }; - - $scope.formProperties.push(newProperty); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newProperty); - }); - }; - - // Click handler for remove button - $scope.removeProperty = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.formProperties.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.formProperties.splice(index, 1); - - if ($scope.formProperties.length == 0) { - $scope.selectedProperty = undefined; - } - - $timeout(function() { - if ($scope.formProperties.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.formProperties[0]); - } - }); - } - }; - - // Click handler for up button - $scope.movePropertyUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.formProperties.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.formProperties[index]; - $scope.formProperties.splice(index, 1); - $timeout(function(){ - $scope.formProperties.splice(index + -1, 0, temp); - $timeout(function() { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.movePropertyDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.formProperties.indexOf(selectedItems[0]); - if (index != $scope.formProperties.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.formProperties[index]; - $scope.formProperties.splice(index, 1); - $timeout(function(){ - $scope.formProperties.splice(index + 1, 0, temp); - $timeout(function() { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - $scope.addNewEnumValue = function() { - if ($scope.selectedProperty) { - var newEnumValue = { id : '', name : ''}; - $scope.selectedProperty.enumValues.push(newEnumValue); - $scope.enumValues.push(newEnumValue); - - $timeout(function () { - $scope.enumGridApi.selection.toggleRowSelection(newEnumValue); - }); - } - }; - - // Click handler for remove button - $scope.removeEnumValue = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.enumValues.indexOf(selectedItems[0]); - $scope.enumGridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.enumValues.splice(index, 1); - $scope.selectedProperty.enumValues.splice(index, 1); - - if ($scope.enumValues.length == 0) { - $scope.selectedEnumValue = undefined; - } - - $timeout(function () { - if ($scope.enumValues.length > 0) { - $scope.enumGridApi.selection.toggleRowSelection($scope.enumValues[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveEnumValueUp = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.enumValues.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.enumValues[index]; - $scope.enumValues.splice(index, 1); - $scope.selectedProperty.enumValues.splice(index, 1); - $timeout(function () { - $scope.enumValues.splice(index + -1, 0, temp); - $scope.selectedProperty.enumValues.splice(index + -1, 0, temp); - $timeout(function () { - $scope.enumGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveEnumValueDown = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.enumValues.indexOf(selectedItems[0]); - if (index != $scope.enumValues.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.enumValues[index]; - $scope.enumValues.splice(index, 1); - $scope.selectedProperty.enumValues.splice(index, 1); - $timeout(function () { - $scope.enumValues.splice(index + 1, 0, temp); - $scope.selectedProperty.enumValues.splice(index + 1, 0, temp); - $timeout(function () { - $scope.enumGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.formProperties.length > 0) { - $scope.property.value = {}; - $scope.property.value.formProperties = $scope.formProperties; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.$hide(); - $scope.property.mode = 'read'; - }; - - // Close button handler - $scope.close = function () { - $scope.$hide(); - $scope.property.mode = 'read'; - }; - - }]) -; \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-form-reference-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-form-reference-controller.js deleted file mode 100644 index a710bcea..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-form-reference-controller.js +++ /dev/null @@ -1,261 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableFormReferenceDisplayCtrl', - [ '$scope', '$modal', '$http', function($scope, $modal, $http) { - - if ($scope.property && $scope.property.value && $scope.property.value.id) { - $http.get(FLOWABLE.APP_URL.getModelUrl($scope.property.value.id)) - .success( - function(response) { - $scope.form = { - id: response.id, - name: response.name - }; - }); - } - -}]); - -angular.module('flowableModeler').controller('FlowableFormReferenceCtrl', - [ '$scope', '$modal', '$http', function($scope, $modal, $http) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/form-reference-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableFormReferencePopupCtrl', - [ '$rootScope', '$scope', '$http', '$location', 'editorManager', function($rootScope, $scope, $http, $location, editorManager) { - - $scope.state = {'loadingForms' : true, 'formError' : false}; - - $scope.popup = {'state' : 'formReference'}; - - $scope.foldersBreadCrumbs = []; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Selecting/deselecting a subprocess - $scope.selectForm = function(form, $event) { - $event.stopPropagation(); - if ($scope.selectedForm && $scope.selectedForm.id && form.id == $scope.selectedForm.id) { - // un-select the current selection - $scope.selectedForm = null; - } else { - $scope.selectedForm = form; - } - }; - - // Saving the selected value - $scope.save = function() { - if ($scope.selectedForm) { - $scope.property.value = { - 'id' : $scope.selectedForm.id, - 'name' : $scope.selectedForm.name, - 'key' : $scope.selectedForm.key - }; - - } else { - $scope.property.value = null; - } - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Open the selected value - $scope.open = function() { - if ($scope.selectedForm) { - $scope.property.value = { - 'id' : $scope.selectedForm.id, - 'name' : $scope.selectedForm.name, - 'key' : $scope.selectedForm.key - }; - - $scope.updatePropertyInModel($scope.property); - - var modelMetaData = editorManager.getBaseModelData(); - var json = editorManager.getModel(); - json = JSON.stringify(json); - - var params = { - modeltype: modelMetaData.model.modelType, - json_xml: json, - name: modelMetaData.name, - key: modelMetaData.key, - description: modelMetaData.description, - newversion: false, - lastUpdated: modelMetaData.lastUpdated - }; - - // Update - $http({ method: 'POST', - data: params, - ignoreErrors: true, - headers: {'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, - transformRequest: function (obj) { - var str = []; - for (var p in obj) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); - } - return str.join("&"); - }, - url: FLOWABLE.URL.putModel(modelMetaData.modelId)}) - - .success(function (data, status, headers, config) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_SAVED - }); - - var allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape); - - $rootScope.addHistoryItem($scope.selectedShape.resourceId); - $location.path('form-editor/' + $scope.selectedForm.id); - - }) - .error(function (data, status, headers, config) { - - }); - - $scope.close(); - } - }; - - $scope.newForm = function() { - $scope.popup.state = 'newForm'; - - var modelMetaData = editorManager.getBaseModelData(); - - $scope.model = { - loading: false, - form: { - name: '', - key: '', - description: '', - modelType: 2 - } - }; - }; - - $scope.createForm = function() { - - if (!$scope.model.form.name || $scope.model.form.name.length == 0 || - !$scope.model.form.key || $scope.model.form.key.length == 0) { - - return; - } - - $scope.model.loading = true; - - $http({method: 'POST', url: FLOWABLE.APP_URL.getModelsUrl(), data: $scope.model.form}). - success(function(data, status, headers, config) { - - var newFormId = data.id; - $scope.property.value = { - 'id' : newFormId, - 'name' : data.name, - 'key' : data.key - }; - $scope.updatePropertyInModel($scope.property); - - var modelMetaData = editorManager.getBaseModelData(); - var json = editorManager.getModel(); - json = JSON.stringify(json); - - var params = { - modeltype: modelMetaData.model.modelType, - json_xml: json, - name: modelMetaData.name, - key: modelMetaData.key, - description: modelMetaData.description, - newversion: false, - lastUpdated: modelMetaData.lastUpdated - }; - - // Update - $http({ method: 'POST', - data: params, - ignoreErrors: true, - headers: {'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, - transformRequest: function (obj) { - var str = []; - for (var p in obj) { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); - } - return str.join("&"); - }, - url: FLOWABLE.URL.putModel(modelMetaData.modelId)}) - - .success(function (data, status, headers, config) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_SAVED - }); - - $scope.model.loading = false; - $scope.$hide(); - - var allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape); - - $rootScope.addHistoryItem($scope.selectedShape.resourceId); - $location.path('form-editor/' + newFormId); - - }) - .error(function (data, status, headers, config) { - $scope.model.loading = false; - $scope.$hide(); - }); - - }). - error(function(data, status, headers, config) { - $scope.model.loading = false; - $scope.model.errorMessage = data.message; - }); - }; - - $scope.cancel = function() { - $scope.close(); - }; - - $scope.loadForms = function() { - var modelMetaData = editorManager.getBaseModelData(); - $http.get(FLOWABLE.APP_URL.getFormModelsUrl()) - .success( - function(response) { - $scope.state.loadingForms = false; - $scope.state.formError = false; - $scope.forms = response.data; - }) - .error( - function(data, status, headers, config) { - $scope.state.loadingForms = false; - $scope.state.formError = true; - }); - }; - - if ($scope.property && $scope.property.value && $scope.property.value.id) { - $scope.selectedForm = $scope.property.value; - } - - $scope.loadForms(); -}]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-httprequest-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-httprequest-controller.js deleted file mode 100644 index c384e62c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-httprequest-controller.js +++ /dev/null @@ -1,24 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableHttpRequestMethodCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) - { - $scope.property.value = 'GET'; - } - - $scope.httpRequestMethodChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-in-parameters-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-in-parameters-controller.js deleted file mode 100644 index 37a0d053..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-in-parameters-controller.js +++ /dev/null @@ -1,184 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Input parameters for call activity - */ - -angular.module('flowableModeler').controller('FlowableInParametersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/in-parameters-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableInParametersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.inParameters !== undefined - && $scope.property.value.inParameters !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.parameters = angular.copy($scope.property.value.inParameters); - } else { - $scope.parameters = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE'); - var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION'); - var targetPromise = $translate('PROPERTY.PARAMETER.TARGET'); - var targetExpressionPromise = $translate('PROPERTY.PARAMETER.TARGETEXPRESSION'); - - $q.all([sourcePromise, sourceExpressionPromise, targetPromise, targetExpressionPromise]).then(function (results) { - $scope.labels.sourceLabel = results[0]; - $scope.labels.sourceExpressionLabel = results[1]; - $scope.labels.targetLabel = results[2]; - $scope.labels.targetExpressionLabel = results[3]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.parameters, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'source', displayName: $scope.labels.sourceLabel}, - {field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel}, - {field: 'target', displayName: $scope.labels.targetLabel}, - {field: 'targetExpression', displayName: $scope.labels.targetExpressionLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedParameter = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewParameter = function () { - var newParameter = { - source: '', - sourceExpression: '', - target: '', - targetExpression: '' - }; - - $scope.parameters.push(newParameter); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newParameter); - }); - }; - - // Click handler for remove button - $scope.removeParameter = function () { - - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.parameters.splice(index, 1); - - if ($scope.parameters.length == 0) { - $scope.selectedParameter = undefined; - } - - $timeout(function () { - if ($scope.parameters.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.parameters[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveParameterUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.parameters[index]; - $scope.parameters.splice(index, 1); - $timeout(function () { - $scope.parameters.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveParameterDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - if (index != $scope.parameters.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.parameters[index]; - $scope.parameters.splice(index, 1); - $timeout(function () { - $scope.parameters.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.parameters.length > 0) { - $scope.property.value = {}; - $scope.property.value.inParameters = $scope.parameters; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-message-definitions-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-message-definitions-controller.js deleted file mode 100644 index 7a803387..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-message-definitions-controller.js +++ /dev/null @@ -1,145 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Execution listeners - */ - -angular.module('flowableModeler').controller('FlowableMessageDefinitionsCtrl', ['$scope', '$modal', function ($scope, $modal) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/message-definitions-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259 -// Will be fixed in a newer version of Angular UI -angular.module('flowableModeler').controller('FlowableMessageDefinitionsPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing mesage definitions on scope - if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.length > 0) { - - if ($scope.property.value.constructor == String) { - $scope.messageDefinitions = JSON.parse($scope.property.value); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.messageDefinitions = angular.copy($scope.property.value); - } - - } else { - $scope.messageDefinitions = []; - } - - // Array to contain selected mesage definitions (yes - we only can select one, but ng-grid isn't smart enough) - $scope.selectedMessageDefinition = undefined; - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var idPromise = $translate('PROPERTY.MESSAGEDEFINITIONS.ID'); - var namePromise = $translate('PROPERTY.MESSAGEDEFINITIONS.NAME'); - - $q.all([idPromise, namePromise]).then(function (results) { - - $scope.labels.idLabel = results[0]; - $scope.labels.nameLabel = results[1]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.messageDefinitions, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'id', displayName: $scope.labels.idLabel}, - {field: 'name', displayName: $scope.labels.nameLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedMessageDefinition = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewMessageDefinition = function () { - var newMessageDefinition = {id: '', name: ''}; - - $scope.messageDefinitions.push(newMessageDefinition); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newMessageDefinition); - }); - }; - - // Click handler for remove button - $scope.removeMessageDefinition = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.messageDefinitions.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.messageDefinitions.splice(index, 1); - - if ($scope.messageDefinitions.length == 0) { - $scope.selectedMesageDefinition = undefined; - } - - $timeout(function () { - if ($scope.messageDefinitions.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.messageDefinitions[0]); - } - }); - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.messageDefinitions.length > 0) { - $scope.property.value = $scope.messageDefinitions; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-message-scope-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-message-scope-controller.js deleted file mode 100644 index 91f690b0..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-message-scope-controller.js +++ /dev/null @@ -1,41 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -angular.module('flowableModeler').controller('FlowableMessageRefCtrl', [ '$scope', function($scope) { - - // Find the parent shape on which the message definitions are defined - var messageDefinitionsProperty = undefined; - var parent = $scope.selectedShape; - while (parent !== null && parent !== undefined && messageDefinitionsProperty === undefined) { - if (parent.properties && parent.properties.get('oryx-messagedefinitions')) { - messageDefinitionsProperty = parent.properties.get('oryx-messagedefinitions'); - } else { - parent = parent.parent; - } - } - - try { - messageDefinitionsProperty = JSON.parse(messageDefinitionsProperty); - if (typeof messageDefinitionsProperty == 'string') { - messageDefinitionsProperty = JSON.parse(messageDefinitionsProperty); - } - } catch (err) { - // Do nothing here, just to be sure we try-catch it - } - - $scope.messageDefinitions = messageDefinitionsProperty; - - - $scope.messageChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-multiinstance-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-multiinstance-controller.js deleted file mode 100644 index 6d90a4e9..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-multiinstance-controller.js +++ /dev/null @@ -1,24 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableMultiInstanceCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) - { - $scope.property.value = 'None'; - } - - $scope.multiInstanceChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-ordering-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-ordering-controller.js deleted file mode 100644 index 241dfc72..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-ordering-controller.js +++ /dev/null @@ -1,28 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Adhoc sub process ordering property - */ - -angular.module('flowableModeler').controller('FlowableOrderingCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) - { - $scope.property.value = 'Parallel'; - } - - $scope.orderingChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-out-parameters-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-out-parameters-controller.js deleted file mode 100644 index b7b10abc..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-out-parameters-controller.js +++ /dev/null @@ -1,180 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Input parameters for call activity - */ - -angular.module('flowableModeler').controller('FlowableOutParametersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/out-parameters-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableOutParametersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.outParameters !== undefined - && $scope.property.value.outParameters !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.parameters = angular.copy($scope.property.value.outParameters); - } else { - $scope.parameters = []; - } - - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE'); - var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION'); - var targetPromise = $translate('PROPERTY.PARAMETER.TARGET'); - var targetExpressionPromise = $translate('PROPERTY.PARAMETER.TARGETEXPRESSION'); - - $q.all([sourcePromise, sourceExpressionPromise, targetPromise, targetExpressionPromise]).then(function (results) { - $scope.labels.sourceLabel = results[0]; - $scope.labels.sourceExpressionLabel = results[1]; - $scope.labels.targetLabel = results[2]; - $scope.labels.targetExpressionLabel = results[3]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.parameters, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'source', displayName: $scope.labels.sourceLabel}, - {field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel}, - {field: 'target', displayName: $scope.labels.targetLabel}, - {field: 'targetExpression', displayName: $scope.labels.targetExpressionLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedParameter = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewParameter = function () { - var newParameter = { - source: '', - sourceExpression: '', - target: '', - targetExpression: ''}; - - $scope.parameters.push(newParameter); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newParameter); - }); - }; - - // Click handler for remove button - $scope.removeParameter = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.parameters.splice(index, 1); - - if ($scope.parameters.length == 0) { - $scope.selectedParameter = undefined; - } - - $timeout(function () { - if ($scope.parameters.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.parameters[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveParameterUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.parameters[index]; - $scope.parameters.splice(index, 1); - $timeout(function () { - $scope.parameters.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveParameterDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.parameters.indexOf(selectedItems[0]); - if (index != $scope.parameters.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.parameters[index]; - $scope.parameters.splice(index, 1); - $timeout(function () { - $scope.parameters.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.parameters.length > 0) { - $scope.property.value = {}; - $scope.property.value.outParameters = $scope.parameters; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-plan-item-lifecycle-listeners-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-plan-item-lifecycle-listeners-controller.js deleted file mode 100644 index 0ae0e0a8..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-plan-item-lifecycle-listeners-controller.js +++ /dev/null @@ -1,357 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -angular.module('flowableModeler').controller('FlowablePlanItemLifecycleListenersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/plan-item-lifecycle-listeners-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowablePlanItemLifecycleListenersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.planItemLifecycleListeners !== undefined - && $scope.property.value.planItemLifecycleListeners !== null) { - - if ($scope.property.value.planItemLifecycleListeners.constructor == String) { - $scope.planItemLifecycleListeners = JSON.parse($scope.property.value.planItemLifecycleListeners); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.planItemLifecycleListeners = angular.copy($scope.property.value.planItemLifecycleListeners); - } - - for (var i = 0; i < $scope.planItemLifecycleListeners.length; i++) { - var planItemLifeCycleListener = $scope.planItemLifecycleListeners[i]; - if (planItemLifeCycleListener.className !== undefined && planItemLifeCycleListener.className !== '') { - planItemLifeCycleListener.implementation = planItemLifeCycleListener.className; - } - else if (planItemLifeCycleListener.expression !== undefined && planItemLifeCycleListener.expression !== '') { - planItemLifeCycleListener.implementation = planItemLifeCycleListener.expression; - } - else if (planItemLifeCycleListener.delegateExpression !== undefined && planItemLifeCycleListener.delegateExpression !== '') { - planItemLifeCycleListener.implementation = planItemLifeCycleListener.delegateExpression; - } - } - } else { - $scope.planItemLifecycleListeners = []; - } - - $scope.selectedListener = undefined; - $scope.selectedField = undefined; - $scope.fields = []; - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var sourceStatePromise = $translate('PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE'); - var targetStatePromise = $translate('PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE'); - var implementationPromise = $translate('PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION'); - var namePromise = $translate('PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME'); - - $q.all([sourceStatePromise, targetStatePromise, implementationPromise, namePromise]).then(function (results) { - $scope.labels.sourceStateLabel = results[1]; - $scope.labels.targetStateLabel = results[2]; - $scope.labels.implementationLabel = results[3]; - $scope.labels.nameLabel = results[4]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.planItemLifecycleListeners, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'sourceState', displayName: $scope.labels.sourceStateLabel}, - {field: 'targetState', displayName: $scope.labels.targetStateLabel}, - {field: 'implementation', displayName: $scope.labels.implementationLabel} - ] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedListener = row.entity; - $scope.selectedField = undefined; - if ($scope.selectedListener) { - var fields = $scope.selectedListener.fields; - if (fields !== undefined && fields !== null) { - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - if (field.stringValue !== undefined && field.stringValue !== '') { - field.implementation = field.stringValue; - } else if (field.expression !== undefined && field.expression !== '') { - field.implementation = field.expression; - } else if (field.string !== undefined && field.string !== '') { - field.implementation = field.string; - } - } - } else { - $scope.selectedListener.fields = []; - } - - $scope.fields.length = 0; - for (var i = 0; i < $scope.selectedListener.fields.length; i++) { - $scope.fields.push($scope.selectedListener.fields[i]); - } - } - }); - }; - - // Config for field grid - $scope.gridFieldOptions = { - data: $scope.fields, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - columnDefs: [{field: 'name', displayName: $scope.labels.name}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridFieldOptions.onRegisterApi = function (gridApi) { - // set gridApi on scope - $scope.fieldGridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedField = row.entity; - }); - }; - }); - - $scope.listenerDetailsChanged = function () { - if ($scope.selectedListener.className !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.className; - } else if ($scope.selectedListener.expression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.expression; - } else if ($scope.selectedListener.delegateExpression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.delegateExpression; - } else { - $scope.selectedListener.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewListener = function () { - var newListener = { - sourceState: 'available', - targetState: 'active', - implementation: '', - className: '', - expression: '', - delegateExpression: '' - }; - $scope.planItemLifecycleListeners.push(newListener); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newListener); - }); - }; - - // Click handler for remove button - $scope.removeListener = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.planItemLifecycleListeners.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.planItemLifecycleListeners.splice(index, 1); - - if ($scope.planItemLifecycleListeners.length == 0) { - $scope.selectedListener = undefined; - } - - $timeout(function () { - if ($scope.planItemLifecycleListeners.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.planItemLifecycleListeners[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveListenerUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.planItemLifecycleListeners.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.planItemLifecycleListeners[index]; - $scope.planItemLifecycleListeners.splice(index, 1); - $timeout(function () { - $scope.planItemLifecycleListeners.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveListenerDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.planItemLifecycleListeners.indexOf(selectedItems[0]); - if (index != $scope.planItemLifecycleListeners.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.planItemLifecycleListeners[index]; - $scope.planItemLifecycleListeners.splice(index, 1); - $timeout(function () { - $scope.planItemLifecycleListeners.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - - } - } - }; - - $scope.fieldDetailsChanged = function () { - if ($scope.selectedField.stringValue != '') { - $scope.selectedField.implementation = $scope.selectedField.stringValue; - } else if ($scope.selectedField.expression != '') { - $scope.selectedField.implementation = $scope.selectedField.expression; - } else if ($scope.selectedField.string != '') { - $scope.selectedField.implementation = $scope.selectedField.string; - } else { - $scope.selectedField.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewField = function () { - if ($scope.selectedListener) { - if ($scope.selectedListener.fields == undefined) { - $scope.selectedListener.fields = []; - } - - var newField = { - name: 'fieldName', - implementation: '', - stringValue: '', - expression: '', - string: '' - }; - $scope.fields.push(newField); - $scope.selectedListener.fields.push(newField); - - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(newField); - }); - } - }; - - // Click handler for remove button - $scope.removeField = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - $scope.fieldGridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - - if ($scope.fields.length == 0) { - $scope.selectedField = undefined; - } - - $timeout(function () { - if ($scope.fields.length > 0) { - $scope.fieldGridApi.selection.toggleRowSelection($scope.fields[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveFieldUp = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + -1, 0, temp); - $scope.selectedListener.fields.splice(index + -1, 0, temp); - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(temp); - }); - }); - - } - } - }; - - // Click handler for down button - $scope.moveFieldDown = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != $scope.fields.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $scope.selectedListeners.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + 1, 0, temp); - $scope.selectedListener.fields.splice(index + 1, 0, temp); - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.planItemLifecycleListeners.length > 0) { - $scope.property.value = {}; - $scope.property.value.planItemLifecycleListeners = $scope.planItemLifecycleListeners; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-planitem-dropdown-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-planitem-dropdown-controller.js deleted file mode 100644 index ad2bdb51..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-planitem-dropdown-controller.js +++ /dev/null @@ -1,82 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowablePlanItemDropdownCtrl', [ '$scope', function($scope) { - - // Find all planitems - var selectedShape = $scope.selectedShape; - if (selectedShape) { - - // Go up in parent chain until plan model is found - var planModel; - var parent = selectedShape.parent; - if (parent) { - while (planModel === undefined && parent !== null && parent !== undefined) { - if (parent.resourceId !== null && parent.resourceId !== undefined && 'casePlanModel' === parent.resourceId) { - planModel = parent; - } else { - parent = parent.parent; - } - } - } - - var planItems = []; - if (planModel !== null && planModel !== undefined) { - - var toVisit = []; - for (var i=0; i 0) { - var child = toVisit.pop(); - if (typeof child.getStencil === 'function' - && (child.getStencil()._jsonStencil.groups.indexOf('Activities') >= 0 || (child.getStencil()._jsonStencil.title === 'Stage') )) { - planItems.push(child); - } - if (child.children !== null && child.children !== undefined) { - for (var i=0; i 0) { - simplifiedPlanItems.sort(function(a,b) { - if(a.name < b.name) { - return -1; - } else if (a.name > b.name) { - return 1; - } else { - return 0; - } - }); - } - $scope.planItems = simplifiedPlanItems; - - } - - if ($scope.property.value == undefined && $scope.property.value == null) { - $scope.property.value = ''; - } - - $scope.planItemChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-process-historylevel-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-process-historylevel-controller.js deleted file mode 100644 index cc5bda78..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-process-historylevel-controller.js +++ /dev/null @@ -1,24 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableProcessHistoryLevelCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) - { - $scope.property.value = 'None'; - } - - $scope.historyLevelChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-process-reference-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-process-reference-controller.js deleted file mode 100644 index 5dff88fc..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-process-reference-controller.js +++ /dev/null @@ -1,86 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableProcessReferenceCtrl', - [ '$scope', '$modal', '$http', function($scope, $modal, $http) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/process-reference-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableProcessReferencePopupCtrl', [ '$scope', '$http', '$location', function($scope, $http, $location) { - - $scope.state = {'loadingProcesses' : true, 'error' : false}; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Selecting/deselecting a process - $scope.selectProcess = function(processModel, $event) { - $event.stopPropagation(); - if ($scope.selectedProcess && $scope.selectedProcess.id && processModel.id == $scope.selectedProcess.id) { - // un-select the current selection - $scope.selectedProcess = null; - } else { - $scope.selectedProcess = processModel; - } - }; - - $scope.open = function() { - if ($scope.selectedProcess) { - $location.path("/editor/" + $scope.selectedProcess.id); - } - }; - - // Saving the selected value - $scope.save = function() { - if ($scope.selectedProcess) { - $scope.property.value = {'id' : $scope.selectedProcess.id, 'name' : $scope.selectedProcess.name, 'key': $scope.selectedProcess.key}; - } else { - $scope.property.value = null; - } - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.loadProcesses = function() { - - $http.get(FLOWABLE.APP_URL.getModelsUrl("?modelType=0")) - .success( - function(response) { - $scope.state.loadingProcesses = false; - $scope.state.processError = false; - $scope.processModels = response.data; - }) - .error( - function(data, status, headers, config) { - $scope.state.loadingProcesses = false; - $scope.state.processError = true; - }); - }; - - if ($scope.property && $scope.property.value && $scope.property.value.id) { - $scope.selectedProcess = $scope.property.value; - } - - $scope.loadProcesses(); -}]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-sequenceflow-order-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-sequenceflow-order-controller.js deleted file mode 100644 index a37c8c46..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-sequenceflow-order-controller.js +++ /dev/null @@ -1,126 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Sequence flow order controller - */ - -angular.module('flowableModeler').controller('FlowableSequenceFlowOrderCtrl', - [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/sequenceflow-order-popup.html?version=' + Date.now(), - scope: $scope - }; - - _internalCreateModal(opts, $modal, $scope); -}]); - -angular.module('flowableModeler').controller('FlowableSequenceFlowOrderPopupCtrl', - ['$scope', '$translate', function($scope, $translate) { - - // Find the outgoing sequence flow of the current selected shape - var outgoingSequenceFlow = []; - var selectedShape = $scope.selectedShape; - if (selectedShape) { - var outgoingNodes = selectedShape.getOutgoingShapes(); - for (var i=0; i 0) { - $scope.property.value = {}; - $scope.property.value.sequenceFlowOrder = []; - - for (var flowIndex=0; flowIndex < $scope.outgoingSequenceFlow.length; flowIndex++) { - $scope.property.value.sequenceFlowOrder.push($scope.outgoingSequenceFlow[flowIndex].id); - } - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - // Cancel click handler - $scope.cancel = function() { - $scope.close(); - }; - - // Close button handler - $scope.close = function() { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-signal-definitions-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-signal-definitions-controller.js deleted file mode 100644 index 63320ff6..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-signal-definitions-controller.js +++ /dev/null @@ -1,151 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Execution listeners - */ - -angular.module('flowableModeler').controller('FlowableSignalDefinitionsCtrl', ['$scope', '$modal', function ($scope, $modal) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/signal-definitions-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); -}]); - -//Need a separate controller for the modal window due to https://github.com/angular-ui/bootstrap/issues/259 -// Will be fixed in a newer version of Angular UI -angular.module('flowableModeler').controller('FlowableSignalDefinitionsPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing signal definitions on scope - if ($scope.property.value !== undefined && $scope.property.value !== null && $scope.property.value.length > 0) { - - if ($scope.property.value.constructor == String) { - $scope.signalDefinitions = JSON.parse($scope.property.value); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.signalDefinitions = angular.copy($scope.property.value); - } - - } else { - $scope.signalDefinitions = []; - } - - // Array to contain selected signal definitions (yes - we only can select one, but ng-grid isn't smart enough) - $scope.selectedSignalDefinition = undefined; - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var idPromise = $translate('PROPERTY.SIGNALDEFINITIONS.ID'); - var namePromise = $translate('PROPERTY.SIGNALDEFINITIONS.NAME'); - var scopePromise = $translate('PROPERTY.SIGNALDEFINITIONS.SCOPE'); - - $q.all([idPromise, namePromise, scopePromise]).then(function (results) { - - $scope.labels.idLabel = results[0]; - $scope.labels.nameLabel = results[1]; - $scope.labels.scopeLabel = results[2]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.signalDefinitions, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [ - {field: 'id', displayName: $scope.labels.idLabel}, - {field: 'name', displayName: $scope.labels.nameLabel}, - {field: 'scope', displayName: $scope.labels.scopeLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedSignalDefinition = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewSignalDefinition = function () { - var newSignalDefinition = {id: '', name: '', scope: 'global'}; - - $scope.signalDefinitions.push(newSignalDefinition); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newSignalDefinition); - }); - }; - - // Click handler for remove button - $scope.removeSignalDefinition = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.signalDefinitions.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.signalDefinitions.splice(index, 1); - - if ($scope.signalDefinitions.length == 0) { - $scope.selectedSignalDefinition = undefined; - } - - $timeout(function () { - if ($scope.signalDefinitions.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.signalDefinitions[0]); - } - }); - } - }; - - $scope.scopeOptions = [{'value': 'global', 'translationId': 'PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL'}, - {'value': 'processInstance', 'translationId': 'PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE'}]; - - // Click handler for save button - $scope.save = function () { - - if ($scope.signalDefinitions.length > 0) { - $scope.property.value = $scope.signalDefinitions; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-signal-scope-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-signal-scope-controller.js deleted file mode 100644 index c1619914..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-signal-scope-controller.js +++ /dev/null @@ -1,42 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableSignalRefCtrl', [ '$scope', function($scope) { - - // Find the parent shape on which the signal definitions are defined - var signalDefinitionsProperty = undefined; - var parent = $scope.selectedShape; - while (parent !== null && parent !== undefined && signalDefinitionsProperty === undefined) { - if (parent.properties && parent.properties.get('oryx-signaldefinitions')) { - signalDefinitionsProperty = parent.properties.get('oryx-signaldefinitions'); - } else { - parent = parent.parent; - } - } - - try { - signalDefinitionsProperty = JSON.parse(signalDefinitionsProperty); - if (typeof signalDefinitionsProperty == 'string') { - signalDefinitionsProperty = JSON.parse(signalDefinitionsProperty); - } - } catch (err) { - // Do nothing here, just to be sure we try-catch it - } - - $scope.signalDefinitions = signalDefinitionsProperty; - - - $scope.signalChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-task-listeners-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-task-listeners-controller.js deleted file mode 100644 index 1c5717da..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-task-listeners-controller.js +++ /dev/null @@ -1,356 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Task listeners - */ - -angular.module('flowableModeler').controller('FlowableTaskListenersCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/task-listeners-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableTaskListenersPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.taskListeners !== undefined - && $scope.property.value.taskListeners !== null) { - - if ($scope.property.value.taskListeners.constructor == String) { - $scope.taskListeners = JSON.parse($scope.property.value.taskListeners); - } - else { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.taskListeners = angular.copy($scope.property.value.taskListeners); - } - - for (var i = 0; i < $scope.taskListeners.length; i++) { - var taskListener = $scope.taskListeners[i]; - if (taskListener.className !== undefined && taskListener.className !== '') { - taskListener.implementation = taskListener.className; - } - else if (taskListener.expression !== undefined && taskListener.expression !== '') { - taskListener.implementation = taskListener.expression; - } - else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '') { - taskListener.implementation = taskListener.delegateExpression; - } - } - } else { - $scope.taskListeners = []; - } - - $scope.selectedListener = undefined; - $scope.selectedField = undefined; - $scope.fields = []; - $scope.translationsRetrieved = false; - - $scope.labels = {}; - - var eventPromise = $translate('PROPERTY.TASKLISTENERS.EVENT'); - var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION'); - var namePromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.NAME'); - - $q.all([eventPromise, implementationPromise, namePromise]).then(function (results) { - $scope.labels.eventLabel = results[0]; - $scope.labels.implementationLabel = results[1]; - $scope.labels.nameLabel = results[2]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.taskListeners, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'event', displayName: $scope.labels.eventLabel}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedListener = row.entity; - $scope.selectedField = undefined; - if ($scope.selectedListener) { - var fields = $scope.selectedListener.fields; - if (fields !== undefined && fields !== null) { - for (var i = 0; i < fields.length; i++) { - var field = fields[i]; - if (field.stringValue !== undefined && field.stringValue !== '') { - field.implementation = field.stringValue; - } else if (field.expression !== undefined && field.expression !== '') { - field.implementation = field.expression; - } else if (field.string !== undefined && field.string !== '') { - field.implementation = field.string; - } - } - } else { - $scope.selectedListener.fields = []; - } - - $scope.fields.length = 0; - for (var i = 0; i < $scope.selectedListener.fields.length; i++) { - $scope.fields.push($scope.selectedListener.fields[i]); - } - } - }); - }; - - // Config for field grid - $scope.gridFieldOptions = { - data: $scope.fields, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - columnDefs: [{field: 'name', displayName: $scope.labels.name}, - {field: 'implementation', displayName: $scope.labels.implementationLabel}] - }; - - $scope.gridFieldOptions.onRegisterApi = function (gridApi) { - // set gridApi on scope - $scope.fieldGridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedField = row.entity; - }); - }; - }); - - $scope.listenerDetailsChanged = function () { - if ($scope.selectedListener.className !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.className; - } else if ($scope.selectedListener.expression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.expression; - } else if ($scope.selectedListener.delegateExpression !== '') { - $scope.selectedListener.implementation = $scope.selectedListener.delegateExpression; - } else { - $scope.selectedListener.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewListener = function () { - var newListener = { - event: 'create', - implementation: '', - className: '', - expression: '', - delegateExpression: '' - }; - $scope.taskListeners.push(newListener); - - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newListener); - }); - }; - - // Click handler for remove button - $scope.removeListener = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.taskListeners.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.taskListeners.splice(index, 1); - - if ($scope.taskListeners.length == 0) { - $scope.selectedListener = undefined; - } - - $timeout(function () { - if ($scope.taskListeners.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.taskListeners[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveListenerUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.taskListeners.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.taskListeners[index]; - $scope.taskListeners.splice(index, 1); - $timeout(function () { - $scope.taskListeners.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveListenerDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.taskListeners.indexOf(selectedItems[0]); - if (index != $scope.taskListeners.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.taskListeners[index]; - $scope.taskListeners.splice(index, 1); - $timeout(function () { - $scope.taskListeners.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - - } - } - }; - - $scope.fieldDetailsChanged = function () { - if ($scope.selectedField.stringValue != '') { - $scope.selectedField.implementation = $scope.selectedField.stringValue; - } else if ($scope.selectedField.expression != '') { - $scope.selectedField.implementation = $scope.selectedField.expression; - } else if ($scope.selectedField.string != '') { - $scope.selectedField.implementation = $scope.selectedField.string; - } else { - $scope.selectedField.implementation = ''; - } - }; - - // Click handler for add button - $scope.addNewField = function () { - if ($scope.selectedListener) { - if ($scope.selectedListener.fields == undefined) { - $scope.selectedListener.fields = []; - } - - var newField = { - name: 'fieldName', - implementation: '', - stringValue: '', - expression: '', - string: '' - }; - $scope.fields.push(newField); - $scope.selectedListener.fields.push(newField); - - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(newField); - }); - } - }; - - // Click handler for remove button - $scope.removeField = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - $scope.fieldGridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - - if ($scope.fields.length == 0) { - $scope.selectedField = undefined; - } - - $timeout(function () { - if ($scope.fields.length > 0) { - $scope.fieldGridApi.selection.toggleRowSelection($scope.fields[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveFieldUp = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $scope.selectedListener.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + -1, 0, temp); - $scope.selectedListener.fields.splice(index + -1, 0, temp); - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(temp); - }); - }); - - } - } - }; - - // Click handler for down button - $scope.moveFieldDown = function () { - var selectedItems = $scope.fieldGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.fields.indexOf(selectedItems[0]); - if (index != $scope.fields.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.fields[index]; - $scope.fields.splice(index, 1); - $scope.selectedListeners.fields.splice(index, 1); - $timeout(function () { - $scope.fields.splice(index + 1, 0, temp); - $scope.selectedListener.fields.splice(index + 1, 0, temp); - $timeout(function () { - $scope.fieldGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.taskListeners.length > 0) { - $scope.property.value = {}; - $scope.property.value.taskListeners = $scope.taskListeners; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-transition-event-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-transition-event-controller.js deleted file mode 100644 index 59a33ab9..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-transition-event-controller.js +++ /dev/null @@ -1,27 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Execution listeners - */ - -angular.module('flowableModeler').controller('FlowableTransitionEventCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) { - $scope.property.value = 'complete'; - } - - $scope.transitionEventChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-trigger-mode-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-trigger-mode-controller.js deleted file mode 100644 index a16041c2..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-trigger-mode-controller.js +++ /dev/null @@ -1,23 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableTriggerModeCtrl', [ '$scope', function($scope) { - - if ($scope.property.value === undefined || $scope.property.value == null) { - $scope.property.value = 'default'; - } - - $scope.triggerModeChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-variable-aggregations-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-variable-aggregations-controller.js deleted file mode 100644 index 1af68d1b..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-variable-aggregations-controller.js +++ /dev/null @@ -1,294 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Variable Aggregations - */ - -angular.module('flowableModeler').controller('FlowableVariableAggregationsCtrl', - ['$scope', '$modal', '$timeout', '$translate', function ($scope, $modal, $timeout, $translate) { - - // Config for the modal window - var opts = { - template: 'editor-app/configuration/properties/variable-aggregations-popup.html?version=' + Date.now(), - scope: $scope - }; - - // Open the dialog - _internalCreateModal(opts, $modal, $scope); - }]); - -angular.module('flowableModeler').controller('FlowableVariableAggregationsPopupCtrl', - ['$scope', '$q', '$translate', '$timeout', function ($scope, $q, $translate, $timeout) { - - // Put json representing form properties on scope - if ($scope.property.value !== undefined && $scope.property.value !== null - && $scope.property.value.aggregations !== undefined - && $scope.property.value.aggregations !== null) { - // Note that we clone the json object rather then setting it directly, - // this to cope with the fact that the user can click the cancel button and no changes should have happened - $scope.aggregations = angular.copy($scope.property.value.aggregations); - } else { - $scope.aggregations = []; - } - - $scope.definitions = []; - $scope.translationsRetrieved = false; - $scope.labels = {}; - - var sourcePromise = $translate('PROPERTY.PARAMETER.SOURCE'); - var sourceExpressionPromise = $translate('PROPERTY.PARAMETER.SOURCEEXPRESSION'); - var targetPromise = $translate('PROPERTY.PARAMETER.TARGET'); - var targetExpressionPromise = $translate('PROPERTY.PARAMETER.TARGETEXPRESSION'); - - $q.all([sourcePromise, sourceExpressionPromise, targetPromise, targetExpressionPromise]).then(function (results) { - $scope.labels.sourceLabel = results[0]; - $scope.labels.sourceExpressionLabel = results[1]; - $scope.labels.targetLabel = results[2]; - $scope.labels.targetExpressionLabel = results[3]; - $scope.translationsRetrieved = true; - - // Config for grid - $scope.gridOptions = { - data: $scope.aggregations, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{field: 'target', displayName: $scope.labels.targetLabel}, - {field: 'targetExpression', displayName: $scope.labels.targetExpressionLabel}] - }; - - $scope.definitionGridOptions = { - data: $scope.definitions, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{ field: 'source', displayName: $scope.labels.sourceLabel }, - { field: 'sourceExpression', displayName: $scope.labels.sourceExpressionLabel}, - { field: 'target', displayName: $scope.labels.targetLabel}, - { field: 'targetExpression', displayName: $scope.labels.targetExpressionLabel}] - } - - - $scope.gridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedAggregation = row.entity; - $scope.selectedVariableDefinitionValue = undefined; - if ($scope.selectedAggregation && $scope.selectedAggregation.definitions) { - $scope.definitions.length = 0; - for (var i = 0; i < $scope.selectedAggregation.definitions.length; i++) { - $scope.definitions.push($scope.selectedAggregation.definitions[i]); - } - } - }); - }; - - $scope.definitionGridOptions.onRegisterApi = function (gridApi) { - //set gridApi on scope - $scope.definitionGridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function (row) { - $scope.selectedVariableDefinitionValue = row.entity; - }); - }; - }); - - // Click handler for add button - $scope.addNewAggregation = function () { - var newAggregation = { - source: '', - sourceExpression: '', - target: '', - targetExpression: ''}; - - $scope.aggregations.push(newAggregation); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(newAggregation); - }); - }; - - // Click handler for remove button - $scope.removeAggregation = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.aggregations.indexOf(selectedItems[0]); - $scope.gridApi.selection.toggleRowSelection(selectedItems[0]); - $scope.aggregations.splice(index, 1); - - if ($scope.aggregations.length == 0) { - $scope.selectedAggregation = undefined; - } - - $timeout(function () { - if ($scope.aggregations.length > 0) { - $scope.gridApi.selection.toggleRowSelection($scope.aggregations[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveAggregationUp = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.aggregations.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.aggregations[index]; - $scope.aggregations.splice(index, 1); - $timeout(function () { - $scope.aggregations.splice(index + -1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveAggregationDown = function () { - var selectedItems = $scope.gridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.aggregations.indexOf(selectedItems[0]); - if (index != $scope.aggregations.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.aggregations[index]; - $scope.aggregations.splice(index, 1); - $timeout(function () { - $scope.aggregations.splice(index + 1, 0, temp); - $timeout(function () { - $scope.gridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - $scope.addNewVariableDefinitionValue = function() { - if ($scope.selectedAggregation) { - var newDefinitionValue = { - source : '', - sourceExpression : '', - target : '', - targetExpression : '', - }; - if ($scope.selectedAggregation.definitions) { - $scope.selectedAggregation.definitions.push(newDefinitionValue); - } else { - $scope.selectedAggregation.definitions = [newDefinitionValue]; - } - $scope.definitions.push(newDefinitionValue); - - $timeout(function () { - $scope.definitionGridApi.selection.toggleRowSelection(newDefinitionValue); - }); - } - }; - - // Click handler for remove button - $scope.removeVariableDefinitionValue = function() { - var selectedItems = $scope.definitionGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.definitions.indexOf(selectedItems[0]); - $scope.definitionGridApi.selection.toggleRowSelection(selectedItems[0]); - - $scope.definitions.splice(index, 1); - $scope.selectedAggregation.definitions.splice(index, 1); - - if ($scope.definitions.length == 0) { - $scope.selectedVariableDefinitionValue = undefined; - } - - $timeout(function () { - if ($scope.definitions.length > 0) { - $scope.definitionGridApi.selection.toggleRowSelection($scope.definitions[0]); - } - }); - } - }; - - // Click handler for up button - $scope.moveVariableDefinitionValueUp = function() { - var selectedItems = $scope.definitionGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.definitions.indexOf(selectedItems[0]); - if (index != 0) { // If it's the first, no moving up of course - var temp = $scope.definitions[index]; - $scope.definitions.splice(index, 1); - $scope.selectedAggregation.definitions.splice(index, 1); - $timeout(function () { - $scope.definitions.splice(index + -1, 0, temp); - $scope.selectedAggregation.definitions.splice(index + -1, 0, temp); - $timeout(function () { - $scope.definitionGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for down button - $scope.moveVariableDefinitionValueDown = function() { - var selectedItems = $scope.enumGridApi.selection.getSelectedRows(); - if (selectedItems && selectedItems.length > 0) { - var index = $scope.definitions.indexOf(selectedItems[0]); - if (index != $scope.definitions.length - 1) { // If it's the last element, no moving down of course - var temp = $scope.definitions[index]; - $scope.definitionGridApi.splice(index, 1); - $scope.selectedAggregation.definitions.splice(index, 1); - $timeout(function () { - $scope.definitions.splice(index + 1, 0, temp); - $scope.selectedAggregation.definitions.splice(index + 1, 0, temp); - $timeout(function () { - $scope.definitionGridApi.selection.toggleRowSelection(temp); - }); - }); - } - } - }; - - // Click handler for save button - $scope.save = function () { - - if ($scope.aggregations.length > 0) { - $scope.property.value = {}; - $scope.property.value.aggregations = $scope.aggregations; - } else { - $scope.property.value = null; - } - - $scope.updatePropertyInModel($scope.property); - $scope.close(); - }; - - $scope.cancel = function () { - $scope.close(); - }; - - // Close button handler - $scope.close = function () { - $scope.property.mode = 'read'; - $scope.$hide(); - }; - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-variable-change-type-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-variable-change-type-controller.js deleted file mode 100644 index 5330953e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties-variable-change-type-controller.js +++ /dev/null @@ -1,23 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('FlowableVariableChangeTypeCtrl', [ '$scope', function($scope) { - - if ($scope.property.value == undefined && $scope.property.value == null) { - $scope.property.value = 'all'; - } - - $scope.variableChangeTypeChanged = function() { - $scope.updatePropertyInModel($scope.property); - }; -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties.js deleted file mode 100644 index ca3cdd11..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties.js +++ /dev/null @@ -1,215 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -'use strict'; - -var FLOWABLE = FLOWABLE || {}; -FLOWABLE.PROPERTY_CONFIG = -{ - "string": { - "templateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/string-property-write-mode-template.html" - }, - "boolean": { - "readModeTemplateUrl": "editor-app/configuration/properties/boolean-property-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/boolean-property-template.html" - }, - "text" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/text-property-write-template.html" - }, - "flowable-calledelementtype" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/calledelementtype-property-write-template.html" - }, - "flowable-multiinstance" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/multiinstance-property-write-template.html" - }, - "flowable-processhistorylevel" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/process-historylevel-property-write-template.html" - }, - "flowable-ordering" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/ordering-property-write-template.html" - }, - "oryx-dataproperties-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/data-properties-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/data-properties-write-template.html" - }, - "oryx-formproperties-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/form-properties-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/form-properties-write-template.html" - }, - "oryx-executionlisteners-multiplecomplex": { - "readModeTemplateUrl": "editor-app/configuration/properties/execution-listeners-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/execution-listeners-write-template.html" - }, - "oryx-tasklisteners-multiplecomplex": { - "readModeTemplateUrl": "editor-app/configuration/properties/task-listeners-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/task-listeners-write-template.html" - }, - "oryx-eventlisteners-multiplecomplex": { - "readModeTemplateUrl": "editor-app/configuration/properties/event-listeners-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/event-listeners-write-template.html" - }, - "oryx-usertaskassignment-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/assignment-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/assignment-write-template.html" - }, - "oryx-servicetaskfields-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/fields-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/fields-write-template.html" - }, - "oryx-servicetaskexceptions-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/exceptions-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/exceptions-write-template.html" - }, - "oryx-callactivityinparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/in-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/in-parameters-write-template.html" - }, - "oryx-callactivityoutparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/out-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/out-parameters-write-template.html" - }, - "oryx-subprocessreference-subprocess-link": { - "readModeTemplateUrl": "editor-app/configuration/properties/subprocess-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/subprocess-reference-write-template.html" - }, - "oryx-formreference-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/form-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/form-reference-write-template.html" - }, - "oryx-sequencefloworder-complex" : { - "readModeTemplateUrl": "editor-app/configuration/properties/sequenceflow-order-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/sequenceflow-order-write-template.html" - }, - "oryx-conditionsequenceflow-complex" : { - "readModeTemplateUrl": "editor-app/configuration/properties/condition-expression-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/condition-expression-write-template.html" - }, - "oryx-signaldefinitions-multiplecomplex" : { - "readModeTemplateUrl": "editor-app/configuration/properties/signal-definitions-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/signal-definitions-write-template.html" - }, - "oryx-signalref-string" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/signal-property-write-template.html" - }, - "oryx-messagedefinitions-multiplecomplex" : { - "readModeTemplateUrl": "editor-app/configuration/properties/message-definitions-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/message-definitions-write-template.html" - }, - "oryx-messageref-string" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/message-property-write-template.html" - }, - "oryx-escalationdefinitions-multiplecomplex" : { - "readModeTemplateUrl": "editor-app/configuration/properties/escalation-definitions-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/escalation-definitions-write-template.html" - }, - "oryx-escalationref-string" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/escalation-property-write-template.html" - }, - "flowable-variablechangetype" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/variable-change-type-property-write-template.html" - }, - "oryx-duedatedefinition-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/duedate-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/duedate-write-template.html" - }, - "oryx-decisiontaskdecisiontablereference-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/decisiontable-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/decisiontable-reference-write-template.html" - }, - "oryx-decisiontaskdecisionservicereference-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/decisionservice-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/decisionservice-reference-write-template.html" - }, - "oryx-decisiondecisiontablereference-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/decisiontable-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/decisiontable-reference-write-template.html" - }, - "oryx-casetaskcasereference-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/case-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/case-reference-write-template.html" - }, - "oryx-processtaskprocessreference-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/process-reference-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/process-reference-write-template.html" - }, - "oryx-processtaskinparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/in-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/in-parameters-write-template.html" - }, - "oryx-processtaskoutparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/out-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/out-parameters-write-template.html" - }, - "oryx-casetaskinparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/in-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/in-parameters-write-template.html" - }, - "oryx-casetaskoutparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/out-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/out-parameters-write-template.html" - }, - "oryx-planitemlifecyclelisteners-multiplecomplex": { - "readModeTemplateUrl": "editor-app/configuration/properties/plan-item-lifecycle-listeners-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/plan-item-lifecycle-listeners-write-template.html" - }, - "flowable-transitionevent" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/transition-event-write-template.html" - }, - "flowable-planitem-dropdown" : { - "readModeTemplateUrl": "editor-app/configuration/properties/planitem-dropdown-read-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/planitem-dropdown-write-template.html" - }, - "flowable-http-request-method" : { - "readModeTemplateUrl": "editor-app/configuration/properties/http-request-method-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/http-request-method-property-write-template.html" - }, - "flowable-triggermode" : { - "readModeTemplateUrl": "editor-app/configuration/properties/trigger-mode-read-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/trigger-mode-write-template.html" - }, - "oryx-eventinparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/event-in-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/event-in-parameters-write-template.html" - }, - "oryx-eventoutparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/event-out-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/event-out-parameters-write-template.html" - }, - "oryx-eventcorrelationparameters-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/event-correlation-parameters-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/event-correlation-parameters-write-template.html" - }, - "flowable-channeltype" : { - "readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/event-channel-type-property-write-template.html" - }, - "oryx-multiinstance_variableaggregations-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/variable-aggregations-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/variable-aggregations-write-template.html" - }, - "oryx-repetition_variableaggregations-complex": { - "readModeTemplateUrl": "editor-app/configuration/properties/variable-aggregations-display-template.html", - "writeModeTemplateUrl": "editor-app/configuration/properties/variable-aggregations-write-template.html" - }, -}; diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/assignment-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/assignment-display-template.html deleted file mode 100644 index bbe69893..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/assignment-display-template.html +++ /dev/null @@ -1,15 +0,0 @@ - -{{'PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY' | translate:property.value.assignment }} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.candidateUsers}} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.candidateGroups}} -{{'PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY' | translate:property.value.assignment.idm.assignee }} -{{'PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY' | translate:property.value.assignment.idm.assignee }} -{{'PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY' | translate:property.value.assignment.idm.assigneeField }} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.idm.candidateUsers}} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.idm.candidateGroups}} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.idm.candidateUserFields}} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.idm.candidateGroupFields}} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.idm.candidateUserFields.concat(property.value.assignment.idm.candidateUsers)}} -{{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.idm.candidateGroupFields.concat(property.value.assignment.idm.candidateGroups)}} -PROPERTY.ASSIGNMENT.EMPTY -PROPERTY.ASSIGNMENT.IDM_EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/assignment-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/assignment-popup.html deleted file mode 100644 index 8089e458..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/assignment-popup.html +++ /dev/null @@ -1,268 +0,0 @@ -
diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/fields-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/fields-write-template.html deleted file mode 100644 index fdc03b76..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/fields-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-display-template.html deleted file mode 100644 index 12743429..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.FORMPROPERTIES.VALUE' | translate:property.value.formProperties}} -PROPERTY.FORMPROPERTIES.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-popup.html deleted file mode 100644 index c16ed862..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-popup.html +++ /dev/null @@ -1,121 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-write-template.html deleted file mode 100644 index 0449718f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-properties-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-display-template.html deleted file mode 100644 index 15444f64..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-display-template.html +++ /dev/null @@ -1,4 +0,0 @@ -
- {{form.name}} - PROPERTY.FORMREFERENCE.EMPTY -
diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-popup.html deleted file mode 100644 index 6c0a2db0..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-popup.html +++ /dev/null @@ -1,74 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-write-template.html deleted file mode 100644 index abb945f6..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/form-reference-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/http-request-method-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/http-request-method-display-template.html deleted file mode 100644 index 2306527c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/http-request-method-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{property.value}} -GET \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/http-request-method-property-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/http-request-method-property-write-template.html deleted file mode 100644 index c9a6ea9d..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/http-request-method-property-write-template.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-display-template.html deleted file mode 100644 index 961e637c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.INPARAMETERS.VALUE' | translate:property.value.inParameters}} -PROPERTY.INPARAMETERS.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-popup.html deleted file mode 100644 index ac477a19..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-popup.html +++ /dev/null @@ -1,57 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-write-template.html deleted file mode 100644 index d6e1872f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/in-parameters-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-display-template.html deleted file mode 100644 index 2a0f3e7f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.MESSAGEDEFINITIONS.DISPLAY' | translate:property.value}} -PROPERTY.MESSAGEDEFINITIONS.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-popup.html deleted file mode 100644 index c93cce9d..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-popup.html +++ /dev/null @@ -1,49 +0,0 @@ - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-write-template.html deleted file mode 100644 index 76e7b889..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-definitions-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-property-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-property-write-template.html deleted file mode 100644 index 8e38ea3e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/message-property-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/multiinstance-property-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/multiinstance-property-write-template.html deleted file mode 100644 index 16c36e91..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/multiinstance-property-write-template.html +++ /dev/null @@ -1,8 +0,0 @@ - -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/ordering-property-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/ordering-property-write-template.html deleted file mode 100644 index 150be209..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/ordering-property-write-template.html +++ /dev/null @@ -1,7 +0,0 @@ - -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-display-template.html deleted file mode 100644 index 859b2e40..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.OUTPARAMETERS.VALUE' | translate:property.value.outParameters}} -PROPERTY.OUTPARAMETERS.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-popup.html deleted file mode 100644 index 6102f34f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-popup.html +++ /dev/null @@ -1,57 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-write-template.html deleted file mode 100644 index ea6986ad..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/out-parameters-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-display-template.html deleted file mode 100644 index 88ffb8bc..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE' | translate:property.value.planItemLifecycleListeners}} -PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-popup.html deleted file mode 100644 index 9679c411..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-popup.html +++ /dev/null @@ -1,125 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-write-template.html deleted file mode 100644 index f073c119..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/plan-item-lifecycle-listeners-write-template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/planitem-dropdown-read-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/planitem-dropdown-read-template.html deleted file mode 100644 index 6edb2a2a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/planitem-dropdown-read-template.html +++ /dev/null @@ -1,4 +0,0 @@ - -{{property.value.name|limitTo:20}} -... -PROPERTY.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/planitem-dropdown-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/planitem-dropdown-write-template.html deleted file mode 100644 index 2ca69441..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/planitem-dropdown-write-template.html +++ /dev/null @@ -1,5 +0,0 @@ - -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-historylevel-property-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-historylevel-property-write-template.html deleted file mode 100644 index bd4efa1f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-historylevel-property-write-template.html +++ /dev/null @@ -1,10 +0,0 @@ - -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-display-template.html deleted file mode 100644 index 9447d084..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{property.value.name}} -PROPERTY.PROCESSREFERENCE.EMPTY diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-popup.html deleted file mode 100644 index a8b3067c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-popup.html +++ /dev/null @@ -1,45 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-write-template.html deleted file mode 100644 index 56461a1e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/process-reference-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-display-template.html deleted file mode 100644 index 90f50e94..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY -PROPERTY.SEQUENCEFLOW.ORDER.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-popup.html deleted file mode 100644 index 2bc65427..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-popup.html +++ /dev/null @@ -1,47 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-write-template.html deleted file mode 100644 index dd562105..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/sequenceflow-order-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-display-template.html deleted file mode 100644 index 7fa105bc..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.SIGNALDEFINITIONS.DISPLAY' | translate:property.value}} -PROPERTY.SIGNALDEFINITIONS.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-popup.html deleted file mode 100644 index 5f21ed7a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-popup.html +++ /dev/null @@ -1,56 +0,0 @@ - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-write-template.html deleted file mode 100644 index 0ee19531..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-definitions-write-template.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-property-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-property-write-template.html deleted file mode 100644 index b8da4322..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/signal-property-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/string-property-write-mode-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/string-property-write-mode-template.html deleted file mode 100644 index 62c3323a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/string-property-write-mode-template.html +++ /dev/null @@ -1,9 +0,0 @@ - -
- -
\ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-display-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-display-template.html deleted file mode 100644 index 4d071713..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-display-template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{'PROPERTY.TASKLISTENERS.VALUE' | translate:property.value.taskListeners}} -PROPERTY.TASKLISTENERS.EMPTY \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-popup.html deleted file mode 100644 index 1c50b5ac..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-popup.html +++ /dev/null @@ -1,102 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-write-template.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-write-template.html deleted file mode 100644 index dda53a17..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/task-listeners-write-template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/text-popup.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/text-popup.html deleted file mode 100644 index 98bab62e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/configuration/properties/text-popup.html +++ /dev/null @@ -1,17 +0,0 @@ - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/select-shape.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/select-shape.html deleted file mode 100644 index ad4ba817..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/select-shape.html +++ /dev/null @@ -1,18 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/unsaved-changes.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/unsaved-changes.html deleted file mode 100644 index 45325c0d..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/unsaved-changes.html +++ /dev/null @@ -1,23 +0,0 @@ - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/validate-model.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/validate-model.html deleted file mode 100644 index 824e5e77..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/popups/validate-model.html +++ /dev/null @@ -1,18 +0,0 @@ - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/process-navigator-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/process-navigator-controller.js deleted file mode 100644 index fe9ff298..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/process-navigator-controller.js +++ /dev/null @@ -1,81 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -angular.module('flowableModeler').controller('ProcessNavigatorController',['editorManager', '$scope',function(editorManager, $scope){ - //problem here the ORYX editor is bound to the rootscope. In theory this communication should be moved to a service. - - $scope.showSubProcess = function(child){ - var flowableShapes = editorManager.getChildShapeByResourceId(child.resourceId); - editorManager.setSelection([flowableShapes],[],true); - } - - $scope.treeview = {}; - $scope.isEditorReady = false; - - $scope.edit = function(resourceId){ - editorManager.edit(resourceId); - }; - - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_EDITOR_READY, function(event){ - $scope.isEditorReady = true; - renderProcessHierarchy(); - - editorManager.registerOnEvent(ORYX.CONFIG.ACTION_DELETE_COMPLETED, filterEvent); - - //always a single event. - editorManager.registerOnEvent(ORYX.CONFIG.EVENT_UNDO_ROLLBACK, renderProcessHierarchy); - }) - - //if an element is added te properties will catch this event. - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_PROPERTY_VALUE_CHANGED,filterEvent); - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_ITEM_DROPPED,filterEvent); - FLOWABLE.eventBus.addListener("EDITORMANAGER-EDIT-ACTION",function(){ - renderProcessHierarchy(); - }); - - function filterEvent(event){ - //this event is fired when the user changes a property by the property editor. - if(event.type === "event-type-property-value-changed"){ - if(event.property.key === "oryx-overrideid" || event.property.key === "oryx-name"){ - renderProcessHierarchy() - } - //this event is fired when the stencil / shape's text is changed / updated. - }else if(event.type === "propertyChanged"){ - if(event.name === "oryx-overrideid" || event.name === "oryx-name"){ - renderProcessHierarchy(); - } - }else if(event.type === ORYX.CONFIG.ACTION_DELETE_COMPLETED){ - renderProcessHierarchy(); - //for some reason the new tree does not trigger an ui update. - //$scope.$apply(); - }else if(event.type === "event-type-item-dropped"){ - renderProcessHierarchy(); - } - } - - function renderProcessHierarchy(){ - //only start calculating when the editor has done all his constructor work. - if(!$scope.isEditorReady){ - return false; - } - - if (!editorManager.isLoading()){ - //the current implementation of has a lot of eventlisteners. when calling getTree() it could manipulate - //the canvastracker while the canvas is stille loading stuff. - //TODO: check if its possible to trigger the re-rendering by a single event instead of registering on 10 events... - $scope.treeview = editorManager.getTree(); - } - - } - -}]); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/select-shape-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/select-shape-controller.js deleted file mode 100644 index d752e071..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/select-shape-controller.js +++ /dev/null @@ -1,318 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Controller for morph shape selection - */ - -angular.module('flowableModeler').controller('FlowableBpmShapeSelectionCtrl', - [ '$rootScope', '$scope', '$timeout', '$translate', 'editorManager', function($rootScope, $scope, $timeout, $translate, editorManager) { - - $scope.currentSelectedMorph = undefined; - - $scope.availableMorphShapes = []; - - for (var i = 0; i < $scope.morphShapes.length; i++) { - if ($scope.morphShapes[i].id != $scope.currentSelectedShape.getStencil().idWithoutNs()) { - $scope.availableMorphShapes.push($scope.morphShapes[i]); - } - } - - // Config for grid - $scope.gridOptions = { - data: $scope.availableMorphShapes, - headerRowHeight: 28, - enableRowSelection: true, - enableRowHeaderSelection: false, - multiSelect: false, - modifierKeysToMultiSelect: false, - enableHorizontalScrollbar: 0, - enableColumnMenus: false, - enableSorting: false, - columnDefs: [{ field: 'objectId', displayName: 'Icon', width: 50, cellTemplate: 'editor-app/popups/icon-template.html?version=' + Date.now() }, - { field: 'name', displayName: 'Name', cellTemplate: '
{{"" + row.entity[col.field] | translate}}
'}] - }; - - $scope.gridOptions.onRegisterApi = function(gridApi) { - //set gridApi on scope - $scope.gridApi = gridApi; - gridApi.selection.on.rowSelectionChanged($scope, function(row) { - if (row.isSelected) { - $scope.currentSelectedMorph = row.entity; - } else { - $scope.currentSelectedMorph = undefined; - } - }); - }; - - // Click handler for save button - $scope.select = function() { - - if ($scope.currentSelectedMorph) { - var MorphTo = ORYX.Core.Command.extend({ - construct: function(shape, stencil, facade){ - this.shape = shape; - this.stencil = stencil; - this.facade = facade; - }, - execute: function(){ - - var shape = this.shape; - var stencil = this.stencil; - var resourceId = shape.resourceId; - - // Serialize all attributes - var serialized = shape.serialize(); - stencil.properties().each((function(prop) { - if(prop.readonly()) { - serialized = serialized.reject(function(serProp) { - return serProp.name==prop.id(); - }); - } - }).bind(this)); - - // Get shape if already created, otherwise create a new shape - if (this.newShape){ - newShape = this.newShape; - this.facade.getCanvas().add(newShape); - } else { - newShape = this.facade.createShape({ - type: stencil.id(), - namespace: stencil.namespace(), - resourceId: resourceId - }); - } - - // calculate new bounds using old shape's upperLeft and new shape's width/height - var boundsObj = serialized.find(function(serProp){ - return (serProp.prefix === "oryx" && serProp.name === "bounds"); - }); - - var changedBounds = null; - - if (!this.facade.getRules().preserveBounds(shape.getStencil())) { - - var bounds = boundsObj.value.split(","); - if (parseInt(bounds[0], 10) > parseInt(bounds[2], 10)) { // if lowerRight comes first, swap array items - var tmp = bounds[0]; - bounds[0] = bounds[2]; - bounds[2] = tmp; - tmp = bounds[1]; - bounds[1] = bounds[3]; - bounds[3] = tmp; - } - bounds[2] = parseInt(bounds[0], 10) + newShape.bounds.width(); - bounds[3] = parseInt(bounds[1], 10) + newShape.bounds.height(); - boundsObj.value = bounds.join(","); - - } else { - - var height = shape.bounds.height(); - var width = shape.bounds.width(); - - // consider the minimum and maximum size of - // the new shape - - if (newShape.minimumSize) { - if (shape.bounds.height() < newShape.minimumSize.height) { - height = newShape.minimumSize.height; - } - - - if (shape.bounds.width() < newShape.minimumSize.width) { - width = newShape.minimumSize.width; - } - } - - if (newShape.maximumSize) { - if (shape.bounds.height() > newShape.maximumSize.height) { - height = newShape.maximumSize.height; - } - - if (shape.bounds.width() > newShape.maximumSize.width) { - width = newShape.maximumSize.width; - } - } - - changedBounds = { - a : { - x: shape.bounds.a.x, - y: shape.bounds.a.y - }, - b : { - x: shape.bounds.a.x + width, - y: shape.bounds.a.y + height - } - }; - - } - - var oPos = shape.bounds.center(); - if (changedBounds !== null) { - newShape.bounds.set(changedBounds); - } - - // Set all related dockers - this.setRelatedDockers(shape, newShape); - - // store DOM position of old shape - var parentNode = shape.node.parentNode; - var nextSibling = shape.node.nextSibling; - - // Delete the old shape - this.facade.deleteShape(shape); - - // Deserialize the new shape - Set all attributes - newShape.deserialize(serialized); - /* - * Change color to default if unchanged - * 23.04.2010 - */ - if (shape.getStencil().property("oryx-bgcolor") - && shape.properties["oryx-bgcolor"] - && shape.getStencil().property("oryx-bgcolor").value().toUpperCase()== shape.properties["oryx-bgcolor"].toUpperCase()){ - if (newShape.getStencil().property("oryx-bgcolor")){ - newShape.setProperty("oryx-bgcolor", newShape.getStencil().property("oryx-bgcolor").value()); - } - } - - if (changedBounds !== null) { - newShape.bounds.set(changedBounds); - } - - if (newShape.getStencil().type()==="edge" || (newShape.dockers.length==0 || !newShape.dockers[0].getDockedShape())) { - newShape.bounds.centerMoveTo(oPos); - } - - if (newShape.getStencil().type()==="node" && (newShape.dockers.length==0 || !newShape.dockers[0].getDockedShape())) { - this.setRelatedDockers(newShape, newShape); - - } - - // place at the DOM position of the old shape - if(nextSibling) parentNode.insertBefore(newShape.node, nextSibling); - else parentNode.appendChild(newShape.node); - - // Set selection - this.facade.setSelection([newShape]); - this.facade.getCanvas().update(); - this.facade.updateSelection(); - this.newShape = newShape; - - }, - rollback: function(){ - - if (!this.shape || !this.newShape || !this.newShape.parent) {return;} - - // Append shape to the parent - this.newShape.parent.add(this.shape); - // Set dockers - this.setRelatedDockers(this.newShape, this.shape); - // Delete new shape - this.facade.deleteShape(this.newShape); - // Set selection - this.facade.setSelection([this.shape]); - // Update - this.facade.getCanvas().update(); - this.facade.updateSelection(); - }, - - /** - * Set all incoming and outgoing edges from the shape to the new shape - * @param {Shape} shape - * @param {Shape} newShape - */ - setRelatedDockers: function(shape, newShape){ - - if(shape.getStencil().type()==="node") { - - (shape.incoming||[]).concat(shape.outgoing||[]) - .each(function(i) { - i.dockers.each(function(docker) { - if (docker.getDockedShape() == shape) { - var rPoint = Object.clone(docker.referencePoint); - // Move reference point per percent - - var rPointNew = { - x: rPoint.x*newShape.bounds.width()/shape.bounds.width(), - y: rPoint.y*newShape.bounds.height()/shape.bounds.height() - }; - - docker.setDockedShape(newShape); - // Set reference point and center to new position - docker.setReferencePoint(rPointNew); - if(i instanceof ORYX.Core.Edge) { - docker.bounds.centerMoveTo(rPointNew); - } else { - var absXY = shape.absoluteXY(); - docker.bounds.centerMoveTo({x:rPointNew.x+absXY.x, y:rPointNew.y+absXY.y}); - //docker.bounds.moveBy({x:rPointNew.x-rPoint.x, y:rPointNew.y-rPoint.y}); - } - } - }); - }); - - // for attached events - if(shape.dockers.length>0&&shape.dockers.first().getDockedShape()) { - newShape.dockers.first().setDockedShape(shape.dockers.first().getDockedShape()); - newShape.dockers.first().setReferencePoint(Object.clone(shape.dockers.first().referencePoint)); - } - - } else { // is edge - newShape.dockers.first().setDockedShape(shape.dockers.first().getDockedShape()); - newShape.dockers.first().setReferencePoint(shape.dockers.first().referencePoint); - newShape.dockers.last().setDockedShape(shape.dockers.last().getDockedShape()); - newShape.dockers.last().setReferencePoint(shape.dockers.last().referencePoint); - } - } - }); - - var stencil = undefined; - var stencilSets = editorManager.getStencilSets().values(); - - var stencilId = $scope.currentSelectedMorph.id; - if ($scope.currentSelectedMorph.genericTaskId) { - stencilId = $scope.currentSelectedMorph.genericTaskId; - } - - for (var i = 0; i < stencilSets.length; i++) { - var stencilSet = stencilSets[i]; - var nodes = stencilSet.nodes(); - for (var j = 0; j < nodes.length; j++) { - if (nodes[j].idWithoutNs() === stencilId) { - stencil = nodes[j]; - break; - } - } - } - - if (!stencil) return; - - // Create and execute command (for undo/redo) - var command = new MorphTo($scope.currentSelectedShape, stencil, editorManager.getEditor()); - editorManager.executeCommands([command]); - } - - $scope.close(); - }; - - $scope.cancel = function() { - $scope.$hide(); - }; - - // Close button handler - $scope.close = function() { - $scope.$hide(); - }; - -}]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencil-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencil-controller.js deleted file mode 100644 index 02c91a82..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencil-controller.js +++ /dev/null @@ -1,1507 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -angular.module('flowableModeler') - .controller('StencilController', ['$rootScope', '$scope', '$http', '$modal', '$timeout', '$window', 'editorManager', - function ($rootScope, $scope, $http, $modal, $timeout, $window, editorManager) { - - // Property window toggle state - $scope.propertyWindowState = {'collapsed': false}; - - // Add reference to global header-config - $scope.headerConfig = FLOWABLE.HEADER_CONFIG; - - $scope.propertyWindowState.toggle = function () { - $scope.propertyWindowState.collapsed = !$scope.propertyWindowState.collapsed; - $timeout(function () { - $window.dispatchEvent(new Event("resize")); - }, 100); - }; - - // Code that is dependent on an initialised Editor is wrapped in a promise for the editor - $scope.editorFactory.promise.then(function () { - - /* Build stencil item list */ - - // Build simple json representation of stencil set - var stencilItemGroups = []; - - // Helper method: find a group in an array - var findGroup = function (name, groupArray) { - for (var index = 0; index < groupArray.length; index++) { - if (groupArray[index].name === name) { - return groupArray[index]; - } - } - return null; - }; - - // Helper method: add a new group to an array of groups - var addGroup = function (groupName, groupArray) { - var group = { name: groupName, items: [], paletteItems: [], groups: [], visible: true }; - groupArray.push(group); - return group; - }; - - /* - StencilSet items - */ - var data = editorManager.getStencilData(); - - var quickMenuDefinition = undefined; - var ignoreForPaletteDefinition = undefined; - - if (data.namespace == 'http://b3mn.org/stencilset/cmmn1.1#') { - quickMenuDefinition = ['HumanTask', 'Association']; - ignoreForPaletteDefinition = ['CasePlanModel']; - - } else if (data.namespace == 'http://b3mn.org/stencilset/dmn1.2#') { - quickMenuDefinition = ['DecisionTableDecision', 'InformationRequirement', 'KnowledgeRequirement']; - ignoreForPaletteDefinition = []; - } else { - quickMenuDefinition = ['UserTask', 'EndNoneEvent', 'ExclusiveGateway', - 'CatchTimerEvent', 'ThrowNoneEvent', 'TextAnnotation', - 'SequenceFlow', 'Association']; - - ignoreForPaletteDefinition = ['SequenceFlow', 'MessageFlow', 'Association', 'DataAssociation', 'DataStore', 'SendTask']; - } - - var quickMenuItems = []; - - var morphRoles = []; - for (var i = 0; i < data.rules.morphingRules.length; i++) - { - var role = data.rules.morphingRules[i].role; - var roleItem = {'role': role, 'morphOptions': []}; - morphRoles.push(roleItem); - } - - // Check all received items - for (var stencilIndex = 0; stencilIndex < data.stencils.length; stencilIndex++) { - - // Check if the root group is the 'diagram' group. If so, this item should not be shown. - var currentGroupName = data.stencils[stencilIndex].groups[0]; - if (currentGroupName === 'Diagram' || currentGroupName === 'BPMN.STENCILS.GROUPS.DIAGRAM' || - currentGroupName === 'CMMN.STENCILS.GROUPS.DIAGRAM' || - currentGroupName === 'DMN.STENCILS.GROUPS.DIAGRAM') { - - continue; // go to next item - } - - var removed = false; - if (data.stencils[stencilIndex].removed) { - removed = true; - } - - var currentGroup = undefined; - if (!removed) { - // Check if this group already exists. If not, we create a new one - - if (currentGroupName !== null && currentGroupName !== undefined && currentGroupName.length > 0) { - - currentGroup = findGroup(currentGroupName, stencilItemGroups); // Find group in root groups array - if (currentGroup === null) { - currentGroup = addGroup(currentGroupName, stencilItemGroups); - } - - // Add all child groups (if any) - for (var groupIndex = 1; groupIndex < data.stencils[stencilIndex].groups.length; groupIndex++) { - var childGroupName = data.stencils[stencilIndex].groups[groupIndex]; - var childGroup = findGroup(childGroupName, currentGroup.groups); - if (childGroup === null) { - childGroup = addGroup(childGroupName, currentGroup.groups); - } - - // The current group variable holds the parent of the next group (if any), - // and is basically the last element in the array of groups defined in the stencil item - currentGroup = childGroup; - - } - - } - } - - // Construct the stencil item - var stencilItem = {'id': data.stencils[stencilIndex].id, - 'name': data.stencils[stencilIndex].title, - 'description': data.stencils[stencilIndex].description, - 'icon': data.stencils[stencilIndex].icon, - 'type': data.stencils[stencilIndex].type, - 'roles': data.stencils[stencilIndex].roles, - 'removed': removed, - 'customIcon': false, - 'canConnect': false, - 'canConnectTo': false, - 'canConnectAssociation': false}; - - if (data.stencils[stencilIndex].customIconId && data.stencils[stencilIndex].customIconId > 0) { - stencilItem.customIcon = true; - stencilItem.icon = data.stencils[stencilIndex].customIconId; - } - - if (!removed) { - if (quickMenuDefinition.indexOf(stencilItem.id) >= 0) { - quickMenuItems[quickMenuDefinition.indexOf(stencilItem.id)] = stencilItem; - } - } - - if (stencilItem.id === 'TextAnnotation' || stencilItem.id === 'BoundaryCompensationEvent') { - stencilItem.canConnectAssociation = true; - } - - for (var i = 0; i < data.stencils[stencilIndex].roles.length; i++) { - var stencilRole = data.stencils[stencilIndex].roles[i]; - if (data.namespace == 'http://b3mn.org/stencilset/cmmn1.1#') { - if (stencilRole === 'association_start') { - stencilItem.canConnect = true; - } else if (stencilRole === 'association_end') { - stencilItem.canConnectTo = true; - } - } else if (data.namespace == 'http://b3mn.org/stencilset/dmn1.2#') { - if (stencilRole === 'information_requirement_start') { - stencilItem.canConnect = true; - } else if (stencilRole === 'information_requirement_end') { - stencilItem.canConnectTo = true; - } - } else { - if (stencilRole === 'sequence_start') { - stencilItem.canConnect = true; - } else if (stencilRole === 'sequence_end') { - stencilItem.canConnectTo = true; - } - } - - for (var j = 0; j < morphRoles.length; j++) { - if (stencilRole === morphRoles[j].role) { - if (!removed) { - morphRoles[j].morphOptions.push(stencilItem); - } - stencilItem.morphRole = morphRoles[j].role; - break; - } - } - } - - if (currentGroup) { - // Add the stencil item to the correct group - currentGroup.items.push(stencilItem); - if (ignoreForPaletteDefinition.indexOf(stencilItem.id) < 0) { - currentGroup.paletteItems.push(stencilItem); - } - - } else { - // It's a root stencil element - if (!removed) { - stencilItemGroups.push(stencilItem); - } - } - } - - for (var i = 0; i < stencilItemGroups.length; i++) { - if (stencilItemGroups[i].paletteItems && stencilItemGroups[i].paletteItems.length == 0) { - stencilItemGroups[i].visible = false; - } - } - - $scope.stencilItemGroups = stencilItemGroups; - - var containmentRules = []; - for (var i = 0; i < data.rules.containmentRules.length; i++) { - var rule = data.rules.containmentRules[i]; - containmentRules.push(rule); - } - $scope.containmentRules = containmentRules; - - // remove quick menu items which are not available anymore due to custom pallette - var availableQuickMenuItems = []; - for (var i = 0; i < quickMenuItems.length; i++) { - if (quickMenuItems[i]) { - availableQuickMenuItems[availableQuickMenuItems.length] = quickMenuItems[i]; - } - } - - $scope.quickMenuItems = availableQuickMenuItems; - $scope.morphRoles = morphRoles; - - /* - * Listen to selection change events: show properties - */ - editorManager.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, function (event) { - var shapes = event.elements; - var canvasSelected = false; - if (shapes && shapes.length == 0) { - shapes = [editorManager.getCanvas()]; - canvasSelected = true; - } - if (shapes && shapes.length > 0) { - - var selectedShape = shapes.first(); - var stencil = selectedShape.getStencil(); - - if ($rootScope.selectedElementBeforeScrolling && stencil.id().indexOf('BPMNDiagram') !== -1 && stencil.id().indexOf('CMMNDiagram') !== -1 && - stencil.id().indexOf('DMNDiagram') !== -1) { - // ignore canvas event because of empty selection when scrolling stops - return; - } - - if ($rootScope.selectedElementBeforeScrolling && $rootScope.selectedElementBeforeScrolling.getId() === selectedShape.getId()) { - $rootScope.selectedElementBeforeScrolling = null; - return; - } - - // Store previous selection - $scope.previousSelectedShape = $scope.selectedShape; - - // Only do something if another element is selected (Oryx fires this event multiple times) - if ($scope.selectedShape !== undefined && $scope.selectedShape.getId() === selectedShape.getId()) { - if ($rootScope.forceSelectionRefresh) { - // Switch the flag again, this run will force refresh - $rootScope.forceSelectionRefresh = false; - } else { - // Selected the same element again, no need to update anything - return; - } - } - - var selectedItem = {'title': '', 'properties': []}; - - if (canvasSelected) { - selectedItem.auditData = { - 'author': $scope.modelData.createdByUser, - 'createDate': $scope.modelData.createDate - }; - } - - // Gather properties of selected item - var properties = stencil.properties(); - for (var i = 0; i < properties.length; i++) { - var property = properties[i]; - if (property.popular() == false) continue; - var key = property.prefix() + "-" + property.id(); - - if (key === 'oryx-name') { - selectedItem.title = selectedShape.properties.get(key); - } - - // First we check if there is a config for 'key-type' and then for 'type' alone - var propertyConfig = FLOWABLE.PROPERTY_CONFIG[key + '-' + property.type()]; - if (propertyConfig === undefined || propertyConfig === null) { - propertyConfig = FLOWABLE.PROPERTY_CONFIG[property.type()]; - } - - if (propertyConfig === undefined || propertyConfig === null) { - console.log('WARNING: no property configuration defined for ' + key + ' of type ' + property.type()); - } else { - - if (selectedShape.properties.get(key) === 'true') { - selectedShape.properties.set(key, true); - } - - if (FLOWABLE.UI_CONFIG.showRemovedProperties == false && property.isHidden()) - { - continue; - } - - var currentProperty = { - 'key': key, - 'title': property.title(), - 'description': property.description(), - 'type': property.type(), - 'mode': 'read', - 'readonly': property.readonly(), - 'hidden': property.isHidden(), - 'value': selectedShape.properties.get(key) - }; - - if ((currentProperty.type === 'complex' || currentProperty.type === 'multiplecomplex') && currentProperty.value && currentProperty.value.length > 0) { - try { - currentProperty.value = JSON.parse(currentProperty.value); - } catch (err) { - // ignore - } - } - - if (propertyConfig.readModeTemplateUrl !== undefined && propertyConfig.readModeTemplateUrl !== null) { - currentProperty.readModeTemplateUrl = propertyConfig.readModeTemplateUrl + '?version=' + $rootScope.staticIncludeVersion; - } - if (propertyConfig.writeModeTemplateUrl !== null && propertyConfig.writeModeTemplateUrl !== null) { - currentProperty.writeModeTemplateUrl = propertyConfig.writeModeTemplateUrl + '?version=' + $rootScope.staticIncludeVersion; - } - - if ((currentProperty.readonly && propertyConfig.templateUrl !== undefined && propertyConfig.templateUrl !== null) || - (currentProperty.readonly === undefined && propertyConfig.templateUrl !== undefined && propertyConfig.templateUrl !== null)) { - currentProperty.templateUrl = propertyConfig.templateUrl + '?version=' + $rootScope.staticIncludeVersion; - currentProperty.hasReadWriteMode = false; - } - else { - currentProperty.hasReadWriteMode = true; - } - - if (currentProperty.value === undefined - || currentProperty.value === null - || currentProperty.value.length == 0) { - currentProperty.noValue = true; - } - - selectedItem.properties.push(currentProperty); - } - } - - // Need to wrap this in an $apply block, see http://jimhoskins.com/2012/12/17/angularjs-and-apply.html - $scope.safeApply(function () { - $scope.selectedItem = selectedItem; - $scope.selectedShape = selectedShape; - }); - - } else { - $scope.safeApply(function () { - $scope.selectedItem = {}; - $scope.selectedShape = null; - }); - } - }); - - editorManager.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, function (event) { - - FLOWABLE.eventBus.dispatch(FLOWABLE.eventBus.EVENT_TYPE_HIDE_SHAPE_BUTTONS); - var shapes = event.elements; - - if (shapes && shapes.length == 1) { - - var selectedShape = shapes.first(); - - var a = editorManager.getCanvas().node.getScreenCTM(); - - var absoluteXY = selectedShape.absoluteXY(); - - absoluteXY.x *= a.a; - absoluteXY.y *= a.d; - - var additionalIEZoom = 1; - if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { - var ua = navigator.userAgent; - if (ua.indexOf('MSIE') >= 0) { - //IE 10 and below - var zoom = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100); - if (zoom !== 100) { - additionalIEZoom = zoom / 100 - } - } - } - - if (additionalIEZoom === 1) { - absoluteXY.y = absoluteXY.y - jQuery("#canvasSection").offset().top + 5; - absoluteXY.x = absoluteXY.x - jQuery("#canvasSection").offset().left; - - } else { - var canvasOffsetLeft = jQuery("#canvasSection").offset().left; - var canvasScrollLeft = jQuery("#canvasSection").scrollLeft(); - var canvasScrollTop = jQuery("#canvasSection").scrollTop(); - - var offset = a.e - (canvasOffsetLeft * additionalIEZoom); - var additionaloffset = 0; - if (offset > 10) { - additionaloffset = (offset / additionalIEZoom) - offset; - } - absoluteXY.y = absoluteXY.y - (jQuery("#canvasSection").offset().top * additionalIEZoom) + 5 + ((canvasScrollTop * additionalIEZoom) - canvasScrollTop); - absoluteXY.x = absoluteXY.x - (canvasOffsetLeft * additionalIEZoom) + additionaloffset + ((canvasScrollLeft * additionalIEZoom) - canvasScrollLeft); - } - - var bounds = new ORYX.Core.Bounds(a.e + absoluteXY.x, a.f + absoluteXY.y, a.e + absoluteXY.x + a.a*selectedShape.bounds.width(), a.f + absoluteXY.y + a.d*selectedShape.bounds.height()); - var shapeXY = bounds.upperLeft(); - - var stencilItem = $scope.getStencilItemById(selectedShape.getStencil().idWithoutNs()); - var morphShapes = []; - if (stencilItem && stencilItem.morphRole) { - for (var i = 0; i < $scope.morphRoles.length; i++) { - if ($scope.morphRoles[i].role === stencilItem.morphRole) { - morphShapes = $scope.morphRoles[i].morphOptions; - } - } - } - - var x = shapeXY.x; - if (bounds.width() < 48) { - x -= 24; - } - - if (morphShapes && morphShapes.length > 0) { - // In case the element is not wide enough, start the 2 bottom-buttons more to the left - // to prevent overflow in the right-menu - - var morphButton = document.getElementById('morph-button'); - morphButton.style.display = "block"; - morphButton.style.left = x + 24 +'px'; - morphButton.style.top = (shapeXY.y+bounds.height() + 2) + 'px'; - } - - var deleteButton = document.getElementById('delete-button'); - deleteButton.style.display = "block"; - deleteButton.style.left = x + 'px'; - deleteButton.style.top = (shapeXY.y+bounds.height() + 2) + 'px'; - - var editable = selectedShape._stencil._jsonStencil.id.endsWith('CollapsedSubProcess') ; - var editButton = document.getElementById('edit-button'); - if (editable) { - editButton.style.display = "block"; - if (morphShapes && morphShapes.length > 0) { - editButton.style.left = x + 24 + 24 + 'px'; - } else { - editButton.style.left = x + 24 +'px'; - } - editButton.style.top = (shapeXY.y+bounds.height() + 2) + 'px'; - - } else { - editButton.style.display = "none"; - } - - if (stencilItem && (stencilItem.canConnect || stencilItem.canConnectAssociation)) { - var quickButtonCounter = 0; - var quickButtonX = shapeXY.x+bounds.width() + 5; - var quickButtonY = shapeXY.y; - jQuery('.Oryx_button').each(function(i, obj) { - if (obj.id !== 'morph-button' && obj.id != 'delete-button' && obj.id !== 'edit-button') { - quickButtonCounter++; - if (quickButtonCounter > 3) { - quickButtonX = shapeXY.x+bounds.width() + 5; - quickButtonY += 24; - quickButtonCounter = 1; - - } else if (quickButtonCounter > 1) { - quickButtonX += 24; - } - - obj.style.display = "block"; - obj.style.left = quickButtonX + 'px'; - obj.style.top = quickButtonY + 'px'; - } - }); - } - } - }); - - if (!$rootScope.stencilInitialized) { - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_HIDE_SHAPE_BUTTONS, function (event) { - jQuery('.Oryx_button').each(function(i, obj) { - obj.style.display = "none"; - }); - }); - - /* - * Listen to property updates and act upon them - */ - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_PROPERTY_VALUE_CHANGED, function (event) { - if (event.property && event.property.key) { - // If the name property is been updated, we also need to change the title of the currently selected item - if (event.property.key === 'oryx-name' && $scope.selectedItem !== undefined && $scope.selectedItem !== null) { - $scope.selectedItem.title = event.newValue; - } - - // Update "no value" flag - event.property.noValue = (event.property.value === undefined - || event.property.value === null - || event.property.value.length == 0); - } - }); - - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_SHOW_VALIDATION_POPUP, function (event) { - // Method to open validation dialog - var showValidationDialog = function() { - $rootScope.currentValidationId = event.validationId; - $rootScope.isOnProcessLevel = event.onProcessLevel; - - _internalCreateModal({template: 'editor-app/popups/validation-errors.html?version=' + Date.now()}, $modal, $rootScope); - }; - - showValidationDialog(); - }); - - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_NAVIGATE_TO_PROCESS, function (event) { - var modelMetaData = editorManager.getBaseModelData(); - $rootScope.editorHistory.push({ - id: modelMetaData.modelId, - name: modelMetaData.name, - type: 'bpmnmodel' - }); - - $window.location.href = "../editor/#/editor/" + event.processId; - }); - - $rootScope.stencilInitialized = true; - } - - $scope.morphShape = function() { - $scope.safeApply(function () { - - var shapes = editorManager.getSelection(); - if (shapes && shapes.length == 1) { - $rootScope.currentSelectedShape = shapes.first(); - var stencilItem = $scope.getStencilItemById($rootScope.currentSelectedShape.getStencil().idWithoutNs()); - var morphShapes = []; - for (var i = 0; i < $scope.morphRoles.length; i++) { - if ($scope.morphRoles[i].role === stencilItem.morphRole) { - morphShapes = $scope.morphRoles[i].morphOptions.slice(); - } - } - - // Method to open shape select dialog (used later on) - var showSelectShapeDialog = function() - { - $rootScope.morphShapes = morphShapes; - _internalCreateModal({ - backdrop: false, - keyboard: true, - template: 'editor-app/popups/select-shape.html?version=' + Date.now() - }, $modal, $rootScope); - }; - - showSelectShapeDialog(); - } - }); - }; - - $scope.deleteShape = function() { - FLOWABLE.TOOLBAR.ACTIONS.deleteItem({'$scope': $scope, 'editorManager': editorManager}); - }; - - $scope.quickAddItem = function(newItemId) { - $scope.safeApply(function () { - - var shapes = editorManager.getSelection(); - if (shapes && shapes.length == 1) { - $rootScope.currentSelectedShape = shapes.first(); - - var containedStencil = undefined; - var stencilSets = editorManager.getStencilSets().values(); - for (var i = 0; i < stencilSets.length; i++) { - var stencilSet = stencilSets[i]; - var nodes = stencilSet.nodes(); - for (var j = 0; j < nodes.length; j++) { - if (nodes[j].idWithoutNs() === newItemId) { - containedStencil = nodes[j]; - break; - } - } - } - - if (!containedStencil) return; - - var option = {type: $scope.currentSelectedShape.getStencil().namespace() + newItemId, namespace: $scope.currentSelectedShape.getStencil().namespace()}; - option['connectedShape'] = $rootScope.currentSelectedShape; - option['parent'] = $rootScope.currentSelectedShape.parent; - option['containedStencil'] = containedStencil; - - var args = { sourceShape: $rootScope.currentSelectedShape, targetStencil: containedStencil }; - var targetStencil = editorManager.getRules().connectMorph(args); - - // Check if there can be a target shape - if (!targetStencil) { - return; - } - - option['connectingType'] = targetStencil.id(); - - var command = new FLOWABLE.CreateCommand(option, undefined, undefined, editorManager.getEditor()); - - editorManager.executeCommands([command]); - } - }); - }; - - $scope.editShape = function(){ - editorManager.edit($scope.selectedShape.resourceId); - }; - - }); // end of $scope.editorFactory.promise block - - /* Click handler for clicking a property */ - $scope.propertyClicked = function (index) { - if (!$scope.selectedItem.properties[index].hidden) { - $scope.selectedItem.properties[index].mode = "write"; - } - }; - - /* Helper method to retrieve the template url for a property */ - $scope.getPropertyTemplateUrl = function (index) { - return $scope.selectedItem.properties[index].templateUrl; - }; - $scope.getPropertyReadModeTemplateUrl = function (index) { - return $scope.selectedItem.properties[index].readModeTemplateUrl; - }; - $scope.getPropertyWriteModeTemplateUrl = function (index) { - return $scope.selectedItem.properties[index].writeModeTemplateUrl; - }; - - /* Method available to all sub controllers (for property controllers) to update the internal Oryx model */ - $scope.updatePropertyInModel = function (property, shapeId) { - - var shape = $scope.selectedShape; - // Some updates may happen when selected shape is already changed, so when an additional - // shapeId is supplied, we need to make sure the correct shape is updated (current or previous) - if (shapeId) { - if (shape.id != shapeId && $scope.previousSelectedShape && $scope.previousSelectedShape.id == shapeId) { - shape = $scope.previousSelectedShape; - } else { - shape = null; - } - } - - if (!shape) { - // When no shape is selected, or no shape is found for the alternative - // shape ID, do nothing - return; - } - var key = property.key; - var newValue = property.value; - var oldValue = shape.properties.get(key); - - if (newValue != oldValue) { - var commandClass = ORYX.Core.Command.extend({ - construct: function () { - this.key = key; - this.oldValue = oldValue; - this.newValue = newValue; - this.shape = shape; - this.facade = editorManager.getEditor(); - }, - execute: function () { - this.shape.setProperty(this.key, this.newValue); - this.facade.getCanvas().update(); - this.facade.updateSelection(); - }, - rollback: function () { - this.shape.setProperty(this.key, this.oldValue); - this.facade.getCanvas().update(); - this.facade.updateSelection(); - } - }); - // Instantiate the class - var command = new commandClass(); - - // Execute the command - editorManager.executeCommands([command]); - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_PROPWINDOW_PROP_CHANGED, - elements: [shape], - key: key - }); - - // Switch the property back to read mode, now the update is done - property.mode = 'read'; - - // Fire event to all who is interested - // Fire event to all who want to know about this - var event = { - type: FLOWABLE.eventBus.EVENT_TYPE_PROPERTY_VALUE_CHANGED, - property: property, - oldValue: oldValue, - newValue: newValue - }; - FLOWABLE.eventBus.dispatch(event.type, event); - } else { - // Switch the property back to read mode, no update was needed - property.mode = 'read'; - } - - }; - - /** - * Helper method that searches a group for an item with the given id. - * If not found, will return undefined. - */ - $scope.findStencilItemInGroup = function (stencilItemId, group) { - - var item; - - // Check all items directly in this group - for (var j = 0; j < group.items.length; j++) { - item = group.items[j]; - if (item.id === stencilItemId) { - return item; - } - } - - // Check the child groups - if (group.groups && group.groups.length > 0) { - for (var k = 0; k < group.groups.length; k++) { - item = $scope.findStencilItemInGroup(stencilItemId, group.groups[k]); - if (item) { - return item; - } - } - } - - return undefined; - }; - - /** - * Helper method to find a stencil item. - */ - $scope.getStencilItemById = function (stencilItemId) { - for (var i = 0; i < $scope.stencilItemGroups.length; i++) { - var element = $scope.stencilItemGroups[i]; - - // Real group - if (element.items !== null && element.items !== undefined) { - var item = $scope.findStencilItemInGroup(stencilItemId, element); - if (item) { - return item; - } - } else { // Root stencil item - if (element.id === stencilItemId) { - return element; - } - } - } - return undefined; - }; - - /* - * DRAG AND DROP FUNCTIONALITY - */ - - $scope.dropCallback = function (event, ui) { - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.attached" - }); - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.added" - }); - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeMenu" - }); - - FLOWABLE.eventBus.dispatch(FLOWABLE.eventBus.EVENT_TYPE_HIDE_SHAPE_BUTTONS); - - if ($scope.dragCanContain) { - - var item = $scope.getStencilItemById(ui.draggable[0].id); - - var pos = {x: event.pageX, y: event.pageY}; - - var additionalIEZoom = 1; - if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { - var ua = navigator.userAgent; - if (ua.indexOf('MSIE') >= 0) { - //IE 10 and below - var zoom = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100); - if (zoom !== 100) { - additionalIEZoom = zoom / 100; - } - } - } - - var screenCTM = editorManager.getCanvas().node.getScreenCTM(); - - // Correcting the UpperLeft-Offset - pos.x -= (screenCTM.e / additionalIEZoom); - pos.y -= (screenCTM.f / additionalIEZoom); - // Correcting the Zoom-Factor - pos.x /= screenCTM.a; - pos.y /= screenCTM.d; - - // Correcting the ScrollOffset - pos.x -= document.documentElement.scrollLeft; - pos.y -= document.documentElement.scrollTop; - - var parentAbs = $scope.dragCurrentParent.absoluteXY(); - pos.x -= parentAbs.x; - pos.y -= parentAbs.y; - - var containedStencil = undefined; - var stencilSets = editorManager.getStencilSets().values(); - for (var i = 0; i < stencilSets.length; i++) { - var stencilSet = stencilSets[i]; - var nodes = stencilSet.nodes(); - for (var j = 0; j < nodes.length; j++) { - if (nodes[j].idWithoutNs() === ui.draggable[0].id) { - containedStencil = nodes[j]; - break; - } - } - - if (!containedStencil) { - var edges = stencilSet.edges(); - for (var j = 0; j < edges.length; j++) { - if (edges[j].idWithoutNs() === ui.draggable[0].id) { - containedStencil = edges[j]; - break; - } - } - } - } - - if (!containedStencil) return; - - if ($scope.quickMenu) { - var shapes = editorManager.getSelection(); - if (shapes && shapes.length == 1) { - var currentSelectedShape = shapes.first(); - - var option = {}; - option.type = currentSelectedShape.getStencil().namespace() + ui.draggable[0].id; - option.namespace = currentSelectedShape.getStencil().namespace(); - option.connectedShape = currentSelectedShape; - option.parent = $scope.dragCurrentParent; - option.containedStencil = containedStencil; - - // If the ctrl key is not pressed, - // snapp the new shape to the center - // if it is near to the center of the other shape - if (!event.ctrlKey) { - // Get the center of the shape - var cShape = currentSelectedShape.bounds.center(); - // Snapp +-20 Pixel horizontal to the center - if (20 > Math.abs(cShape.x - pos.x)) { - pos.x = cShape.x; - } - // Snapp +-20 Pixel vertical to the center - if (20 > Math.abs(cShape.y - pos.y)) { - pos.y = cShape.y; - } - } - - option.position = pos; - - if (containedStencil.idWithoutNs() !== 'SequenceFlow' && containedStencil.idWithoutNs() !== 'Association' && - containedStencil.idWithoutNs() !== 'MessageFlow' && containedStencil.idWithoutNs() !== 'DataAssociation' && - containedStencil.idWithoutNs() !== 'InformationRequirement' && containedStencil.idWithoutNs() !== 'KnowledgeRequirement') { - - var args = { sourceShape: currentSelectedShape, targetStencil: containedStencil }; - var targetStencil = editorManager.getRules().connectMorph(args); - if (!targetStencil) { // Check if there can be a target shape - return; - } - option.connectingType = targetStencil.id(); - } - - var command = new FLOWABLE.CreateCommand(option, $scope.dropTargetElement, pos, editorManager.getEditor()); - - editorManager.executeCommands([command]); - } - - } else { - var canAttach = false; - if (containedStencil.idWithoutNs() === 'BoundaryErrorEvent' || containedStencil.idWithoutNs() === 'BoundaryTimerEvent' || - containedStencil.idWithoutNs() === 'BoundarySignalEvent' || containedStencil.idWithoutNs() === 'BoundaryMessageEvent' || - containedStencil.idWithoutNs() === 'BoundaryCancelEvent' || containedStencil.idWithoutNs() === 'BoundaryCompensationEvent') { - - // Modify position, otherwise boundary event will get position related to left corner of the canvas instead of the container - pos = editorManager.eventCoordinates( event ); - canAttach = true; - } - - var option = {}; - option['type'] = $scope.modelData.model.stencilset.namespace + item.id; - option['namespace'] = $scope.modelData.model.stencilset.namespace; - option['position'] = pos; - option['parent'] = $scope.dragCurrentParent; - - var commandClass = ORYX.Core.Command.extend({ - construct: function(option, dockedShape, canAttach, position, facade){ - this.option = option; - this.docker = null; - this.dockedShape = dockedShape; - this.dockedShapeParent = dockedShape.parent || facade.getCanvas(); - this.position = position; - this.facade = facade; - this.selection = this.facade.getSelection(); - this.shape = null; - this.parent = null; - this.canAttach = canAttach; - }, - execute: function(){ - if (!this.shape) { - this.shape = this.facade.createShape(option); - this.parent = this.shape.parent; - } else if (this.parent) { - this.parent.add(this.shape); - } - - if (this.canAttach && this.shape.dockers && this.shape.dockers.length) { - this.docker = this.shape.dockers[0]; - - this.dockedShapeParent.add(this.docker.parent); - - // Set the Docker to the new Shape - this.docker.setDockedShape(undefined); - this.docker.bounds.centerMoveTo(this.position); - if (this.dockedShape !== this.facade.getCanvas()) { - this.docker.setDockedShape(this.dockedShape); - } - this.facade.setSelection( [this.docker.parent] ); - } - - this.facade.getCanvas().update(); - this.facade.updateSelection(); - - }, - rollback: function(){ - if (this.shape) { - this.facade.setSelection(this.selection.without(this.shape)); - this.facade.deleteShape(this.shape); - } - if (this.canAttach && this.docker) { - this.docker.setDockedShape(undefined); - } - this.facade.getCanvas().update(); - this.facade.updateSelection(); - - } - }); - - // Update canvas - var command = new commandClass(option, $scope.dragCurrentParent, canAttach, pos, editorManager.getEditor()); - editorManager.executeCommands([command]); - - // Fire event to all who want to know about this - var dropEvent = { - type: FLOWABLE.eventBus.EVENT_TYPE_ITEM_DROPPED, - droppedItem: item, - position: pos - }; - FLOWABLE.eventBus.dispatch(dropEvent.type, dropEvent); - } - } - - $scope.dragCurrentParent = undefined; - $scope.dragCurrentParentId = undefined; - $scope.dragCurrentParentStencil = undefined; - $scope.dragCanContain = undefined; - $scope.quickMenu = undefined; - $scope.dropTargetElement = undefined; - }; - - - $scope.overCallback = function (event, ui) { - $scope.dragModeOver = true; - }; - - $scope.outCallback = function (event, ui) { - $scope.dragModeOver = false; - }; - - $scope.startDragCallback = function (event, ui) { - $scope.dragModeOver = false; - $scope.quickMenu = false; - if (!ui.helper.hasClass('stencil-item-dragged')) { - ui.helper.addClass('stencil-item-dragged'); - } - }; - - $scope.startDragCallbackQuickMenu = function (event, ui) { - $scope.dragModeOver = false; - $scope.quickMenu = true; - }; - - $scope.dragCallback = function (event, ui) { - - if ($scope.dragModeOver != false) { - - var coord = editorManager.eventCoordinatesXY(event.pageX, event.pageY); - - var additionalIEZoom = 1; - if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { - var ua = navigator.userAgent; - if (ua.indexOf('MSIE') >= 0) { - //IE 10 and below - var zoom = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100); - if (zoom !== 100) { - additionalIEZoom = zoom / 100 - } - } - } - - if (additionalIEZoom !== 1) { - coord.x = coord.x / additionalIEZoom; - coord.y = coord.y / additionalIEZoom; - } - - var aShapes = editorManager.getCanvas().getAbstractShapesAtPosition(coord); - - if (aShapes.length <= 0) { - if (event.helper) { - $scope.dragCanContain = false; - return false; - } - } - - if (aShapes[0] instanceof ORYX.Core.Canvas) { - editorManager.getCanvas().setHightlightStateBasedOnX(coord.x); - } - - if (aShapes.length == 1 && aShapes[0] instanceof ORYX.Core.Canvas) { - var item = $scope.getStencilItemById(event.target.id); - var parentCandidate = aShapes[0]; - - if (item.id === 'Lane' || item.id === 'BoundaryErrorEvent' || item.id === 'BoundaryMessageEvent' || - item.id === 'BoundarySignalEvent' || item.id === 'BoundaryTimerEvent' || - item.id === 'BoundaryCancelEvent' || item.id === 'BoundaryCompensationEvent' || - item.id === 'EntryCriterion') { - - $scope.dragCanContain = false; - - // Show Highlight - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, - highlightId: 'shapeRepo.added', - elements: [parentCandidate], - style: ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE, - color: ORYX.CONFIG.SELECTION_INVALID_COLOR - }); - - } else { - $scope.dragCanContain = true; - $scope.dragCurrentParent = parentCandidate; - $scope.dragCurrentParentId = parentCandidate.id; - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.added" - }); - } - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.attached" - }); - - return false; - - } else { - var item = $scope.getStencilItemById(event.target.id); - - var parentCandidate = aShapes.reverse().find(function (candidate) { - return (candidate instanceof ORYX.Core.Canvas - || candidate instanceof ORYX.Core.Node - || candidate instanceof ORYX.Core.Edge); - }); - - if (!parentCandidate) { - $scope.dragCanContain = false; - return false; - } - - if (item.type === "node") { - - // check if the draggable is a boundary event and the parent an Activity - var _canContain = false; - var parentStencilId = parentCandidate.getStencil().id(); - - if ($scope.dragCurrentParentId && $scope.dragCurrentParentId === parentCandidate.id) { - return false; - } - - var parentItem = $scope.getStencilItemById(parentCandidate.getStencil().idWithoutNs()); - if (parentCandidate.getStencil().id().endsWith("DecisionServiceSection")) { - if (item.id === 'Decision') { - _canContain = true; - } - } else if (parentItem.roles.indexOf('Activity') > -1) { - if (item.roles.indexOf('IntermediateEventOnActivityBoundary') > -1 - || item.roles.indexOf('EntryCriterionOnItemBoundary') > -1 - || item.roles.indexOf('ExitCriterionOnItemBoundary') > -1) { - _canContain = true; - } - - } else if(parentItem.roles.indexOf('StageActivity') > -1) { - if (item.roles.indexOf('EntryCriterionOnItemBoundary') > -1 - || item.roles.indexOf('ExitCriterionOnItemBoundary') > -1) { - _canContain = true; - } - - } else if(parentItem.roles.indexOf('StageModelActivity') > -1) { - if (item.roles.indexOf('ExitCriterionOnItemBoundary') > -1) { - _canContain = true; - } - - } else if (parentCandidate.getStencil().idWithoutNs() === 'Pool') { - if (item.id === 'Lane') { - _canContain = true; - } - } - - if (_canContain) { - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, - highlightId: "shapeRepo.attached", - elements: [parentCandidate], - style: ORYX.CONFIG.SELECTION_HIGHLIGHT_STYLE_RECTANGLE, - color: ORYX.CONFIG.SELECTION_VALID_COLOR - }); - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.added" - }); - - } else { - for (var i = 0; i < $scope.containmentRules.length; i++) { - var rule = $scope.containmentRules[i]; - if (rule.role === parentItem.id) { - for (var j = 0; j < rule.contains.length; j++) { - if (item.roles.indexOf(rule.contains[j]) > -1) { - _canContain = true; - break; - } - } - - if (_canContain) { - break; - } - } - } - - // Show Highlight - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, - highlightId: 'shapeRepo.added', - elements: [parentCandidate], - color: _canContain ? ORYX.CONFIG.SELECTION_VALID_COLOR : ORYX.CONFIG.SELECTION_INVALID_COLOR - }); - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.attached" - }); - } - - $scope.dragCurrentParent = parentCandidate; - $scope.dragCurrentParentId = parentCandidate.id; - $scope.dragCurrentParentStencil = parentStencilId; - $scope.dragCanContain = _canContain; - - } else { - var canvasCandidate = editorManager.getCanvas(); - var canConnect = false; - - var targetStencil = $scope.getStencilItemById(parentCandidate.getStencil().idWithoutNs()); - if (targetStencil) { - var associationConnect = false; - if (stencil.idWithoutNs() === 'Association' && (curCan.getStencil().idWithoutNs() === 'TextAnnotation' || curCan.getStencil().idWithoutNs() === 'BoundaryCompensationEvent')) { - associationConnect = true; - } else if (stencil.idWithoutNs() === 'DataAssociation' && curCan.getStencil().idWithoutNs() === 'DataStore') { - associationConnect = true; - } - - if (targetStencil.canConnectTo || associationConnect) { - canConnect = true; - } - } - - //Edge - $scope.dragCurrentParent = canvasCandidate; - $scope.dragCurrentParentId = canvasCandidate.id; - $scope.dragCurrentParentStencil = canvasCandidate.getStencil().id(); - $scope.dragCanContain = canConnect; - - // Show Highlight - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, - highlightId: 'shapeRepo.added', - elements: [canvasCandidate], - color: ORYX.CONFIG.SELECTION_VALID_COLOR - }); - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_HIDE, - highlightId: "shapeRepo.attached" - }); - } - } - } - }; - - $scope.dragCallbackQuickMenu = function (event, ui) { - - if ($scope.dragModeOver != false) { - var coord = editorManager.eventCoordinatesXY(event.pageX, event.pageY); - - var additionalIEZoom = 1; - if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) { - var ua = navigator.userAgent; - if (ua.indexOf('MSIE') >= 0) { - //IE 10 and below - var zoom = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100); - if (zoom !== 100) { - additionalIEZoom = zoom / 100 - } - } - } - - if (additionalIEZoom !== 1) { - coord.x = coord.x / additionalIEZoom; - coord.y = coord.y / additionalIEZoom; - } - - var aShapes = editorManager.getCanvas().getAbstractShapesAtPosition(coord); - - if (aShapes.length <= 0) { - if (event.helper) { - $scope.dragCanContain = false; - return false; - } - } - - if (aShapes[0] instanceof ORYX.Core.Canvas) { - editorManager.getCanvas().setHightlightStateBasedOnX(coord.x); - } - - var stencil = undefined; - var stencilSets = editorManager.getStencilSets().values(); - for (var i = 0; i < stencilSets.length; i++) { - var stencilSet = stencilSets[i]; - var nodes = stencilSet.nodes(); - for (var j = 0; j < nodes.length; j++) { - if (nodes[j].idWithoutNs() === event.target.id) { - stencil = nodes[j]; - break; - } - } - - if (!stencil) { - var edges = stencilSet.edges(); - for (var j = 0; j < edges.length; j++) { - if (edges[j].idWithoutNs() === event.target.id) { - stencil = edges[j]; - break; - } - } - } - } - - var candidate = aShapes.last(); - - var isValid = false; - if (stencil.type() === "node") { - //check containment rules - var canContain = editorManager.getRules().canContain({containingShape:candidate, containedStencil:stencil}); - - var parentCandidate = aShapes.reverse().find(function (candidate) { - return (candidate instanceof ORYX.Core.Canvas - || candidate instanceof ORYX.Core.Node - || candidate instanceof ORYX.Core.Edge); - }); - - if (!parentCandidate) { - $scope.dragCanContain = false; - return false; - } - - $scope.dragCurrentParent = parentCandidate; - $scope.dragCurrentParentId = parentCandidate.id; - $scope.dragCurrentParentStencil = parentCandidate.getStencil().id(); - $scope.dragCanContain = canContain; - $scope.dropTargetElement = parentCandidate; - isValid = canContain; - - } else { //Edge - - var shapes = editorManager.getSelection(); - if (shapes && shapes.length == 1) { - var currentSelectedShape = shapes.first(); - var curCan = candidate; - var canConnect = false; - - var targetStencil = $scope.getStencilItemById(curCan.getStencil().idWithoutNs()); - if (targetStencil) { - var associationConnect = false; - if (stencil.idWithoutNs() === 'Association' && (curCan.getStencil().idWithoutNs() === 'TextAnnotation' || curCan.getStencil().idWithoutNs() === 'BoundaryCompensationEvent')) { - associationConnect = true; - } else if (stencil.idWithoutNs() === 'DataAssociation' && curCan.getStencil().idWithoutNs() === 'DataStore') { - associationConnect = true; - } - - if (targetStencil.canConnectTo || associationConnect) { - while (!canConnect && curCan && !(curCan instanceof ORYX.Core.Canvas)) { - candidate = curCan; - //check connection rules - canConnect = editorManager.getRules().canConnect({ - sourceShape: currentSelectedShape, - edgeStencil: stencil, - targetShape: curCan - }); - curCan = curCan.parent; - } - } - } - var parentCandidate = editorManager.getCanvas(); - - isValid = canConnect; - $scope.dragCurrentParent = parentCandidate; - $scope.dragCurrentParentId = parentCandidate.id; - $scope.dragCurrentParentStencil = parentCandidate.getStencil().id(); - $scope.dragCanContain = canConnect; - $scope.dropTargetElement = candidate; - } - - } - - editorManager.handleEvents({ - type: ORYX.CONFIG.EVENT_HIGHLIGHT_SHOW, - highlightId:'shapeMenu', - elements: [candidate], - color: isValid ? ORYX.CONFIG.SELECTION_VALID_COLOR : ORYX.CONFIG.SELECTION_INVALID_COLOR - }); - } - }; - - }]); - -var FLOWABLE = FLOWABLE || {}; -//create command for undo/redo -FLOWABLE.CreateCommand = ORYX.Core.Command.extend({ - construct: function(option, currentReference, position, facade){ - this.option = option; - this.currentReference = currentReference; - this.position = position; - this.facade = facade; - this.shape; - this.edge; - this.targetRefPos; - this.sourceRefPos; - /* - * clone options parameters - */ - this.connectedShape = option.connectedShape; - this.connectingType = option.connectingType; - this.namespace = option.namespace; - this.type = option.type; - this.containedStencil = option.containedStencil; - this.parent = option.parent; - this.currentReference = currentReference; - this.shapeOptions = option.shapeOptions; - }, - execute: function(){ - - if (this.shape) { - if (this.shape instanceof ORYX.Core.Node) { - this.parent.add(this.shape); - if (this.edge) { - this.facade.getCanvas().add(this.edge); - this.edge.dockers.first().setDockedShape(this.connectedShape); - this.edge.dockers.first().setReferencePoint(this.sourceRefPos); - this.edge.dockers.last().setDockedShape(this.shape); - this.edge.dockers.last().setReferencePoint(this.targetRefPos); - } - - this.facade.setSelection([this.shape]); - - } else if (this.shape instanceof ORYX.Core.Edge) { - this.facade.getCanvas().add(this.shape); - this.shape.dockers.first().setDockedShape(this.connectedShape); - this.shape.dockers.first().setReferencePoint(this.sourceRefPos); - } - } - else { - this.shape = this.facade.createShape(this.option); - this.edge = (!(this.shape instanceof ORYX.Core.Edge)) ? this.shape.getIncomingShapes().first() : undefined; - } - - if (this.currentReference && this.position) { - - if (this.shape instanceof ORYX.Core.Edge) { - - if (!(this.currentReference instanceof ORYX.Core.Canvas)) { - this.shape.dockers.last().setDockedShape(this.currentReference); - - if (this.currentReference.getStencil().idWithoutNs() === 'TextAnnotation') - { - var midpoint = {}; - midpoint.x = 0; - midpoint.y = this.currentReference.bounds.height() / 2; - this.shape.dockers.last().setReferencePoint(midpoint); - } - else - { - this.shape.dockers.last().setReferencePoint(this.currentReference.bounds.midPoint()); - } - } - else { - this.shape.dockers.last().bounds.centerMoveTo(this.position); - } - this.sourceRefPos = this.shape.dockers.first().referencePoint; - this.targetRefPos = this.shape.dockers.last().referencePoint; - - } else if (this.edge){ - this.sourceRefPos = this.edge.dockers.first().referencePoint; - this.targetRefPos = this.edge.dockers.last().referencePoint; - } - } else { - var containedStencil = this.containedStencil; - var connectedShape = this.connectedShape; - var bc = connectedShape.bounds; - var bs = this.shape.bounds; - - var pos = bc.center(); - if(containedStencil.defaultAlign()==="north") { - pos.y -= (bc.height() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET + (bs.height()/2); - } else if(containedStencil.defaultAlign()==="northeast") { - pos.x += (bc.width() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.width()/2); - pos.y -= (bc.height() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.height()/2); - } else if(containedStencil.defaultAlign()==="southeast") { - pos.x += (bc.width() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.width()/2); - pos.y += (bc.height() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.height()/2); - } else if(containedStencil.defaultAlign()==="south") { - pos.y += (bc.height() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET + (bs.height()/2); - } else if(containedStencil.defaultAlign()==="southwest") { - pos.x -= (bc.width() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.width()/2); - pos.y += (bc.height() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.height()/2); - } else if(containedStencil.defaultAlign()==="west") { - pos.x -= (bc.width() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET + (bs.width()/2); - } else if(containedStencil.defaultAlign()==="northwest") { - pos.x -= (bc.width() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.width()/2); - pos.y -= (bc.height() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET_CORNER + (bs.height()/2); - } else { - pos.x += (bc.width() / 2) + ORYX.CONFIG.SHAPEMENU_CREATE_OFFSET + (bs.width()/2); - } - - // Move shape to the new position - this.shape.bounds.centerMoveTo(pos); - - // Move all dockers of a node to the position - if (this.shape instanceof ORYX.Core.Node){ - (this.shape.dockers||[]).each(function(docker){ - docker.bounds.centerMoveTo(pos); - }); - } - - //this.shape.update(); - this.position = pos; - - if (this.edge){ - this.sourceRefPos = this.edge.dockers.first().referencePoint; - this.targetRefPos = this.edge.dockers.last().referencePoint; - } - } - - this.facade.getCanvas().update(); - this.facade.updateSelection(); - - }, - rollback: function(){ - this.facade.deleteShape(this.shape); - if(this.edge) { - this.facade.deleteShape(this.edge); - } - //this.currentParent.update(); - this.facade.setSelection(this.facade.getSelection().without(this.shape, this.edge)); - } -}); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/adhoc.subprocess.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/adhoc.subprocess.png deleted file mode 100644 index bf50968a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/adhoc.subprocess.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.collapsed.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.collapsed.png deleted file mode 100644 index a58a58bd..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.collapsed.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.png deleted file mode 100644 index db72fee2..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/expanded.subprocess.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/expanded.subprocess.png deleted file mode 100644 index 085343c8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/expanded.subprocess.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.business.rule.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.business.rule.png deleted file mode 100644 index 7b3f3b67..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.business.rule.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.camel.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.camel.png deleted file mode 100644 index 1682eb7e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.camel.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.decision.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.decision.png deleted file mode 100644 index 0351fee8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.decision.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.http.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.http.png deleted file mode 100644 index ffba8de1..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.http.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.manual.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.manual.png deleted file mode 100644 index 8dc32983..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.manual.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.mule.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.mule.png deleted file mode 100644 index 6b35fbef..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.mule.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.receive.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.receive.png deleted file mode 100644 index fffe93fb..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.receive.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.script.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.script.png deleted file mode 100644 index 674e4b89..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.script.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.send.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.send.png deleted file mode 100644 index 8ebe452e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.send.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.service.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.service.png deleted file mode 100644 index 8035fb98..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.service.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.shell.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.shell.png deleted file mode 100644 index 53226b1e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.shell.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.user.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.user.png deleted file mode 100644 index 60562a0a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.user.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/subprocess.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/subprocess.png deleted file mode 100644 index 329b24ca..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/subprocess.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/task.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/task.png deleted file mode 100644 index dd4e53bd..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/activity/task.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/artifact/text.annotation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/artifact/text.annotation.png deleted file mode 100644 index ab870a29..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/artifact/text.annotation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/cancel.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/cancel.png deleted file mode 100644 index e0316621..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/cancel.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/compensation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/compensation.png deleted file mode 100644 index 8b32f238..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/compensation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/conditional.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/conditional.png deleted file mode 100644 index a661281b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/conditional.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/error.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/error.png deleted file mode 100644 index 27603c4c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/error.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/escalation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/escalation.png deleted file mode 100644 index 08dd1429..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/escalation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/message.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/message.png deleted file mode 100644 index ba997f7d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/message.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/multiple.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/multiple.png deleted file mode 100644 index 35299b5b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/multiple.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/signal.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/signal.png deleted file mode 100644 index 19ea9185..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/signal.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/timer.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/timer.png deleted file mode 100644 index adb275f4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/catching/timer.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/association.undirected.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/association.undirected.png deleted file mode 100644 index f7954dce..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/association.undirected.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/association.unidirectional.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/association.unidirectional.png deleted file mode 100644 index 7a9be868..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/association.unidirectional.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/messageflow.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/messageflow.png deleted file mode 100644 index cd6bbafc..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/messageflow.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/sequenceflow.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/sequenceflow.png deleted file mode 100644 index d757a244..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/connector/sequenceflow.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/dataobject/data.store.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/dataobject/data.store.png deleted file mode 100644 index 922f66f7..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/dataobject/data.store.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/diagram.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/diagram.png deleted file mode 100644 index 45c5818d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/diagram.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/cancel.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/cancel.png deleted file mode 100644 index a4302bf8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/cancel.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/error.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/error.png deleted file mode 100644 index 3e310a73..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/error.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/escalation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/escalation.png deleted file mode 100644 index 3a4a724b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/escalation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/none.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/none.png deleted file mode 100644 index c46d1602..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/none.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/terminate.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/terminate.png deleted file mode 100644 index 0d6f780d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/endevent/terminate.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/eventbased.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/eventbased.png deleted file mode 100644 index 7aa78b71..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/eventbased.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/exclusive.databased.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/exclusive.databased.png deleted file mode 100644 index 3aaf8fa4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/exclusive.databased.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/inclusive.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/inclusive.png deleted file mode 100644 index 13e84f63..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/inclusive.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/parallel.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/parallel.png deleted file mode 100644 index ef82f487..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/gateway/parallel.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/conditional.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/conditional.png deleted file mode 100644 index fe56892c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/conditional.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/error.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/error.png deleted file mode 100644 index 27603c4c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/error.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/escalation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/escalation.png deleted file mode 100644 index e19c715a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/escalation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/message.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/message.png deleted file mode 100644 index ba997f7d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/message.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/multiple.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/multiple.png deleted file mode 100644 index 0385633f..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/multiple.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/none.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/none.png deleted file mode 100644 index 8b51f188..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/none.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/signal.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/signal.png deleted file mode 100644 index 828a260b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/signal.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/timer.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/timer.png deleted file mode 100644 index adb275f4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/startevent/timer.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/swimlane/lane.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/swimlane/lane.png deleted file mode 100644 index f0e7a823..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/swimlane/lane.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/swimlane/pool.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/swimlane/pool.png deleted file mode 100644 index 82c2213c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/swimlane/pool.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/compensation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/compensation.png deleted file mode 100644 index a8ef1e2c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/compensation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/escalation.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/escalation.png deleted file mode 100644 index 8318a2db..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/escalation.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/none.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/none.png deleted file mode 100644 index 7be082ea..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/none.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/signal.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/signal.png deleted file mode 100644 index c5979fbf..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/bpmn2.0/icons/throwing/signal.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/casefileitem.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/casefileitem.png deleted file mode 100644 index 5c42a8f8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/casefileitem.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/casetask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/casetask.png deleted file mode 100644 index 68be8d60..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/casetask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/collapsed.planfragment.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/collapsed.planfragment.png deleted file mode 100644 index 68e6ec2f..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/collapsed.planfragment.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/decisiontask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/decisiontask.png deleted file mode 100644 index 0351fee8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/decisiontask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/expanded.planfragment.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/expanded.planfragment.png deleted file mode 100644 index c68cd0a8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/expanded.planfragment.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/httptask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/httptask.png deleted file mode 100644 index ffba8de1..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/httptask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/humantask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/humantask.png deleted file mode 100644 index f19f6ef4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/humantask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/mailtask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/mailtask.png deleted file mode 100644 index 8ebe452e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/mailtask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/milestone.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/milestone.png deleted file mode 100644 index 6c2e106b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/milestone.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/processtask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/processtask.png deleted file mode 100644 index ff9130bf..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/processtask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/scripttask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/scripttask.png deleted file mode 100644 index 674e4b89..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/scripttask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/sendeventtask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/sendeventtask.png deleted file mode 100644 index 8ebe452e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/sendeventtask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/servicetask.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/servicetask.png deleted file mode 100644 index 8035fb98..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/servicetask.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/task.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/task.png deleted file mode 100644 index 40c8f702..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/task.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/timereventlistener.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/timereventlistener.png deleted file mode 100644 index adb275f4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/activity/timereventlistener.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/connection/connector.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/connection/connector.png deleted file mode 100644 index 34462c3d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/connection/connector.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/caseplanmodel.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/caseplanmodel.png deleted file mode 100644 index 8d28aecf..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/caseplanmodel.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/collapsed.stage.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/collapsed.stage.png deleted file mode 100644 index 1c2c21c6..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/collapsed.stage.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/expanded.stage.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/expanded.stage.png deleted file mode 100644 index 01535249..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/containers/expanded.stage.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/diagram.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/diagram.png deleted file mode 100644 index 45c5818d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/diagram.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/eventlistener.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/eventlistener.png deleted file mode 100644 index 8a3b48ad..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/eventlistener.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/timerlistener.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/timerlistener.png deleted file mode 100644 index c7557234..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/timerlistener.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/userlistener.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/userlistener.png deleted file mode 100644 index d28aae9e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/userlistener.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/variablelistener.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/variablelistener.png deleted file mode 100644 index 0385633f..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/event/variablelistener.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/sentry/entry.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/sentry/entry.png deleted file mode 100644 index d01db669..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/sentry/entry.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/sentry/exit.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/sentry/exit.png deleted file mode 100644 index cbc2579c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/sentry/exit.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/tables/planningtable.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/tables/planningtable.png deleted file mode 100644 index 80ed1f9b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/cmmn1.1/icons/tables/planningtable.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_action.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_action.png deleted file mode 100644 index accebc88..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_action.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_action_container.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_action_container.png deleted file mode 100644 index 43a60732..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_action_container.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_alert.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_alert.png deleted file mode 100644 index 03f277dd..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_alert.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_case.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_case.png deleted file mode 100644 index e805f99e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_case.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_checkbox.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_checkbox.png deleted file mode 100644 index 463c9a27..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_checkbox.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_choices.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_choices.png deleted file mode 100644 index 45b779bc..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_choices.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_combo.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_combo.png deleted file mode 100644 index aba156d8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_combo.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_date.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_date.png deleted file mode 100644 index 5b5aac1e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_date.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_form.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_form.png deleted file mode 100644 index 09da6d82..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_form.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_group.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_group.png deleted file mode 100644 index dcdf0e77..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_group.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_header.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_header.png deleted file mode 100644 index d15165f4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_header.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_help.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_help.png deleted file mode 100644 index a4813738..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_help.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_hint.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_hint.png deleted file mode 100644 index 457dbbf2..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_hint.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_input.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_input.png deleted file mode 100644 index ba36563a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_input.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_item.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_item.png deleted file mode 100644 index 26e1dba2..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_item.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_itemset.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_itemset.png deleted file mode 100644 index 3f517070..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_itemset.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_label.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_label.png deleted file mode 100644 index d20cd3c3..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_label.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_number.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_number.png deleted file mode 100644 index 304d77ad..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_number.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_output.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_output.png deleted file mode 100644 index b50cd8f4..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_output.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_paragraph.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_paragraph.png deleted file mode 100644 index 2caf4c12..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_paragraph.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_radiobutton.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_radiobutton.png deleted file mode 100644 index 1a11ece6..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_radiobutton.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_range.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_range.png deleted file mode 100644 index 583e5261..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_range.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_repeat.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_repeat.png deleted file mode 100644 index 2a872ca0..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_repeat.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_repeating_group.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_repeating_group.png deleted file mode 100644 index 1b854aec..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_repeating_group.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_secret.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_secret.png deleted file mode 100644 index 5efba288..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_secret.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_select.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_select.png deleted file mode 100644 index 568c6cb8..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_select.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_select1.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_select1.png deleted file mode 100644 index 4bbb9385..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_select1.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_separator.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_separator.png deleted file mode 100644 index c46362be..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_separator.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_submit.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_submit.png deleted file mode 100644 index c9f22164..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_submit.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_switch.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_switch.png deleted file mode 100644 index 3d818beb..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_switch.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_textarea.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_textarea.png deleted file mode 100644 index 125fd8bc..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_textarea.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_trigger.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_trigger.png deleted file mode 100644 index df1e2c53..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_trigger.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_upload.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_upload.png deleted file mode 100644 index 5cc01398..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/icons/new_upload.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/xforms.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/xforms.png deleted file mode 100644 index 5ccde407..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/stencilsets/xforms/xforms.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/toolbar-controller.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/toolbar-controller.js deleted file mode 100644 index 07e1d2e8..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/toolbar-controller.js +++ /dev/null @@ -1,186 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -angular.module('flowableModeler') - .controller('ToolbarController', ['$scope', '$http', '$modal', '$q', '$rootScope', '$translate', '$location', 'editorManager', - function ($scope, $http, $modal, $q, $rootScope, $translate, $location, editorManager) { - - $scope.editorFactory.promise.then(function () { - var toolbarItems = FLOWABLE.TOOLBAR_CONFIG.items; - $scope.items = []; - - for (var i = 0; i < toolbarItems.length; i++) - { - if ($rootScope.modelData.model.modelType === 'form') - { - if (!toolbarItems[i].disableInForm) - { - $scope.items.push(toolbarItems[i]); - } - } - else - { - $scope.items.push(toolbarItems[i]); - } - } - }); - - $scope.secondaryItems = FLOWABLE.TOOLBAR_CONFIG.secondaryItems; - - // Call configurable click handler (From http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string) - var executeFunctionByName = function(functionName, context /*, args */) { - var args = Array.prototype.slice.call(arguments).splice(2); - var namespaces = functionName.split("."); - var func = namespaces.pop(); - for(var i = 0; i < namespaces.length; i++) { - context = context[namespaces[i]]; - } - return context[func].apply(this, args); - }; - - // Click handler for toolbar buttons - $scope.toolbarButtonClicked = function(buttonIndex) { - - // Default behaviour - var buttonClicked = $scope.items[buttonIndex]; - var services = { '$scope' : $scope, '$rootScope' : $rootScope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, 'editorManager' : editorManager}; - executeFunctionByName(buttonClicked.action, window, services); - - // Other events - var event = { - type : FLOWABLE.eventBus.EVENT_TYPE_TOOLBAR_BUTTON_CLICKED, - toolbarItem : buttonClicked - }; - FLOWABLE.eventBus.dispatch(event.type, event); - }; - - // Click handler for secondary toolbar buttons - $scope.toolbarSecondaryButtonClicked = function(buttonIndex) { - var buttonClicked = $scope.secondaryItems[buttonIndex]; - var services = { '$scope' : $scope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, '$location': $location, 'editorManager' : editorManager}; - executeFunctionByName(buttonClicked.action, window, services); - }; - - /* Key bindings */ - Mousetrap.bind('mod+z', function(e) { - var services = { '$scope' : $scope, '$rootScope' : $rootScope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, 'editorManager' : editorManager}; - FLOWABLE.TOOLBAR.ACTIONS.undo(services); - return false; - }); - - Mousetrap.bind('mod+y', function(e) { - var services = { '$scope' : $scope, '$rootScope' : $rootScope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, 'editorManager' : editorManager}; - FLOWABLE.TOOLBAR.ACTIONS.redo(services); - return false; - }); - - Mousetrap.bind('mod+c', function(e) { - var services = { '$scope' : $scope, '$rootScope' : $rootScope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, 'editorManager' : editorManager}; - FLOWABLE.TOOLBAR.ACTIONS.copy(services); - return false; - }); - - Mousetrap.bind('mod+v', function(e) { - var services = { '$scope' : $scope, '$rootScope' : $rootScope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, 'editorManager' : editorManager}; - FLOWABLE.TOOLBAR.ACTIONS.paste(services); - return false; - }); - - Mousetrap.bind(['del'], function(e) { - var services = { '$scope' : $scope, '$rootScope' : $rootScope, '$http' : $http, '$modal' : $modal, '$q' : $q, '$translate' : $translate, 'editorManager' : editorManager}; - FLOWABLE.TOOLBAR.ACTIONS.deleteItem(services); - return false; - }); - - /* Undo logic */ - - $scope.undoStack = []; - $scope.redoStack = []; - - FLOWABLE.eventBus.addListener(FLOWABLE.eventBus.EVENT_TYPE_UNDO_REDO_RESET,function($scope){ - this.undoStack = []; - this.redoStack = []; - if (this.items) { - for(var i = 0; i < this.items.length; i++) { - var item = this.items[i]; - if (item.action === 'FLOWABLE.TOOLBAR.ACTIONS.undo' || item.action === "FLOWABLE.TOOLBAR.ACTIONS.redo"){ - item.enabled = false; - } - } - } - - },$scope); - - $scope.editorFactory.promise.then(function() { - - // Catch all command that are executed and store them on the respective stacks - editorManager.registerOnEvent(ORYX.CONFIG.EVENT_EXECUTE_COMMANDS, function( evt ){ - - // If the event has commands - if( !evt.commands ){ return; } - - $scope.undoStack.push( evt.commands ); - $scope.redoStack = []; - - for(var i = 0; i < $scope.items.length; i++) - { - var item = $scope.items[i]; - if (item.action === 'FLOWABLE.TOOLBAR.ACTIONS.undo') - { - item.enabled = true; - } - else if (item.action === 'FLOWABLE.TOOLBAR.ACTIONS.redo') - { - item.enabled = false; - } - } - - // Update - editorManager.getCanvas().update(); - editorManager.updateSelection(); - - }); - - }); - - // Handle enable/disable toolbar buttons - $scope.editorFactory.promise.then(function() { - editorManager.registerOnEvent(ORYX.CONFIG.EVENT_SELECTION_CHANGED, function( evt ){ - var elements = evt.elements; - - for(var i = 0; i < $scope.items.length; i++) { - var item = $scope.items[i]; - if (item.enabledAction && item.enabledAction === 'element') { - var minLength = 1; - if (item.minSelectionCount) { - minLength = item.minSelectionCount; - } - - if (elements.length >= minLength && !item.enabled) { - $scope.safeApply(function () { - item.enabled = true; - }); - } else if (elements.length == 0 && item.enabled) { - $scope.safeApply(function () { - item.enabled = false; - }); - } - } - } - }); - - }); - - }]); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/tour.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/tour.js deleted file mode 100644 index 0f29024a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/editor-app/tour.js +++ /dev/null @@ -1,201 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var FLOWABLE_EDITOR_TOUR = { - - /* - * General 'getting started' tutorial for the Editor. - */ - gettingStarted: function($scope, $translate, $q, useLocalStorage) { - var userName; - if ($scope.account.firstName) { - userName = $scope.account.firstName; - } else { - userName = $scope.account.fullname; - } - - $q.all([ - $translate('TOUR.WELCOME-TITLE', {userName: userName}), $translate('TOUR.WELCOME-CONTENT'), - $translate('TOUR.PALETTE-TITLE'), $translate('TOUR.PALETTE-CONTENT'), - $translate('TOUR.CANVAS-TITLE'), $translate('TOUR.CANVAS-CONTENT'), - $translate('TOUR.DRAGDROP-TITLE'), $translate('TOUR.DRAGDROP-CONTENT'), - $translate('TOUR.PROPERTIES-TITLE'), $translate('TOUR.PROPERTIES-CONTENT'), - $translate('TOUR.TOOLBAR-TITLE'), $translate('TOUR.TOOLBAR-CONTENT'), - $translate('TOUR.END-TITLE'), $translate('TOUR.END-CONTENT') - ]).then(function(translations) { - - // We're using a hack here due to https://github.com/sorich87/bootstrap-tour/issues/85: - // when clicking next in the tour, it always sets the 'display' css property to 'none' - // The hack is simple: before the next step is shown, we reset the 'display' property to 'block' - - var tourStepDomElements = ['body', '#paletteHelpWrapper', '#canvasHelpWrapper', '#propertiesHelpWrapper', '#editor-header']; - - var tour = new Tour({ - name: 'activitiEditorTour', - storage: (useLocalStorage ? window.localStorage : false), - container: 'body', - backdrop: true, - keyboard: true, - steps: [ - { - orphan: true, - title: translations[0], - content: translations[1], - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, true, false, 300), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[0]) - }, - { - element: tourStepDomElements[1], - title: translations[2], - content: translations[3], - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, true, false, 400, 'images/tour/open-group.gif'), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[1]) - }, - { - element: tourStepDomElements[2], - title: translations[4], - content: translations[5], - placement: 'left', - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, true, false), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[2]) - }, - { - orphan: true, - title: translations[6], - content: translations[7], - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, true, false, 720, 'images/tour/tour-dnd.gif'), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[0]) - }, - { - element: tourStepDomElements[3], - title: translations[8], - content: translations[9], - placement: 'top', - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, true, false, 400), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[3]) - }, - { - element: tourStepDomElements[4], - title: translations[10], - content: translations[11], - placement: 'bottom', - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, true, false, 400), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[4]) - }, - { - orphan: true, - title: translations[12], - content: translations[13], - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, false, true, 400), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[0]) - } - ], - - onEnd: FLOWABLE_EDITOR_TOUR._buildOnEndFunction(tourStepDomElements) - }); - - tour.init(); - tour.start(); - }) - }, - - /* - * Tutorial showing how to use the bendpoint functionality for sequenceflow - */ - sequenceFlowBendpoint: function($scope, $translate, $q, useLocalStorage) { - - $q.all([ - $translate('FEATURE-TOUR.BENDPOINT.TITLE'), $translate('FEATURE-TOUR.BENDPOINT.DESCRIPTION') - ]).then(function(translations) { - - // We're using a hack here due to https://github.com/sorich87/bootstrap-tour/issues/85: - // when clicking next in the tour, it always sets the 'display' css property to 'none' - // The hack is simple: before the next step is shown, we reset the 'display' property to 'block' - - var tourStepDomElements = ['body']; - - var tour = new Tour({ - name: 'bendpointTour', - storage: (useLocalStorage ? window.localStorage : false), - container: 'body', - backdrop: true, - keyboard: true, - steps: [ - { - orphan: true, - title: translations[0], - content: translations[1], - template: FLOWABLE_EDITOR_TOUR._buildStepTemplate(false, false, true, 500, 'images/tour/sequenceflow-bendpoint.gif'), - onNext: FLOWABLE_EDITOR_TOUR._buildOnNextFunction(tourStepDomElements[0]) - } - ], - - onEnd: FLOWABLE_EDITOR_TOUR._buildOnEndFunction(tourStepDomElements) - }); - - tour.init(); - tour.start(); - }) - }, - - - - _buildStepTemplate : function (addPrevButton, addNextButton, addEndTourButton, optionalForcedWidth, image) { - - var width = 200; - if (optionalForcedWidth) { - width = optionalForcedWidth; - } - - var template = - '
' + - '
' + - '

' + - '
' + - '
'; - if (image) { - template = template + '
'; - } - if (addPrevButton) { - template = template + ''; - } - if (addNextButton) { - template = template + ''; - } - if (addEndTourButton) { - template = template + ''; - } - - template = template + '
' + '' + '
'; - return template; - }, - - _buildOnNextFunction: function(selector) { - return function () { - jQuery(selector).each(function (i, obj) { - obj.style.display = 'block'; - }) - }; - }, - - _buildOnEndFunction: function(selectors) { - return function () { - for (var elementsToResetIndex = 0; elementsToResetIndex < selectors.length; elementsToResetIndex++) { - jQuery(selectors[elementsToResetIndex]).each(function (i, obj) { - obj.style.display = 'block'; - }); - } - } - } - -}; diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/favicon.ico b/io.sc.platform.lcdp.frontend/public/flowable/modeler/favicon.ico deleted file mode 100644 index cf1ae80f..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/favicon.ico and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/TitilliumWeb-Bold.ttf b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/TitilliumWeb-Bold.ttf deleted file mode 100755 index 0af0fe7d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/TitilliumWeb-Bold.ttf and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/TitilliumWeb-Regular.ttf b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/TitilliumWeb-Regular.ttf deleted file mode 100755 index 6da82193..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/TitilliumWeb-Regular.ttf and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.eot b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.eot deleted file mode 100755 index 74c04811..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.eot and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.svg b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.svg deleted file mode 100755 index f92e2195..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.ttf b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.ttf deleted file mode 100755 index 34f143ff..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.ttf and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.woff b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.woff deleted file mode 100755 index c210f615..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/cherokee-webfont.woff and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.eot b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.svg b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 44694887..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.ttf b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.woff b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index d83c539b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.eot b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.eot deleted file mode 100755 index b95d7cf5..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.eot and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.svg b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.svg deleted file mode 100755 index 80674cfe..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.svg +++ /dev/null @@ -1,4551 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.ttf b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.ttf deleted file mode 100755 index 87107fc5..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.ttf and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.woff b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.woff deleted file mode 100755 index 14e3ea26..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-bold-webfont.woff and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.eot b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.eot deleted file mode 100644 index b294f6c3..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.eot and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.svg b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.svg deleted file mode 100644 index 96737afe..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.svg +++ /dev/null @@ -1,4241 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.ttf b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.ttf deleted file mode 100644 index 0768020a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.ttf and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.woff b/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.woff deleted file mode 100644 index 038accb6..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/fonts/lato-regular-webfont.woff and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/en.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/en.json deleted file mode 100644 index 617d0f6c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/en.json +++ /dev/null @@ -1,3079 +0,0 @@ -{ - "GENERAL" : { - "MAIN-TITLE": "Flowable Editor", - "NAVIGATION" : { - "PROCESSES": "Processes", - "CASEMODELS": "Case models", - "FORMS": "Forms", - "DECISIONS": "Decisions", - "APPS": "Apps" - }, - "TITLE": { - "SELECT-GROUP" :"Select group", - "MATCHING-GROUPS": "Matching groups", - "FILTER": "Filter", - "HISTORY": "History" - }, - "ACTION": { - "LOGOUT": "Sign out", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST": "Show all definitions", - "CANCEL": "Cancel", - "CLOSE": "Close", - "EDIT": "Edit", - "SAVE": "Save", - "OPEN": "Open", - "OK": "Ok", - "CONFIRM": "Confirm", - "CONFIRM-AND-CLOSE": "Confirm and close", - "NEW-FORM": "New form", - "CREATE-FORM": "Create form", - "NEW-DECISION-TABLE": "New Decision Table", - "CREATE-DECISION-TABLE": "Create Decision Table", - "NEW-DECISION-SERVICE": "New Decision Service", - "CREATE-DECISION-SERVICE": "Create Decision Service" - }, - "MESSAGE": { - "SELECT-GROUP-HELP": "Use ↑ and ↓ to select and press Enter to confirm", - "PEOPLE-NO-MATCHING-RESULTS": "No matching users were found", - "GROUP-NO-MATCHING-RESULTS": "No matching groups were found", - "GROUP-SOURCE-TYPE": "Group source", - "GROUP-SOURCE-SEARCH-OPTION": "Group search", - "GROUP-SOURCE-FIELD-OPTION": "Form field" - }, - "OTHERS" : { - "PROCESS" : "Process", - "PROCESS_NAVIGATOR" : "Process Navigator", - "NO_STRUCTURAL_ELEMENTS_USED" : "No structural elements used." - } - }, - - "BPMN" : { - "TITLE": "Process editor", - "DESCRIPTION" : "BPMN process editor", - "PROPERTYPACKAGES" : { - "PROCESS_IDPACKAGE" : { - "PROCESS_ID" : { - "TITLE" : "Process identifier", - "DESCRIPTION" : "Unique identifier of the process definition." - } - }, - "OVERRIDEIDPACKAGE" : { - "OVERRIDEID" : { - "TITLE" : "Id", - "DESCRIPTION" : "Unique identifier of the element." - } - }, - "NAMEPACKAGE" : { - "NAME" : { - "TITLE" : "Name", - "DESCRIPTION" : "The descriptive name of the BPMN element." - } - }, - "DOCUMENTATIONPACKAGE" : { - "DOCUMENTATION" : { - "TITLE" : "Documentation", - "DESCRIPTION" : "Documentation of the BPMN element." - } - }, - "CATEGORYPACKAGE" : { - "CATEGORYDEFINITION" : { - "TITLE" : "Category", - "DESCRIPTION" : "Category of the BPMN element." - } - }, - "PROCESS_AUTHORPACKAGE" : { - "PROCESS_AUTHOR" : { - "TITLE" : "Process author", - "DESCRIPTION" : "Author of the process definition." - } - }, - "PROCESS_VERSIONPACKAGE" : { - "PROCESS_VERSION" : { - "TITLE" : "Process version string (documentation only)", - "DESCRIPTION" : "Version identifier for documentation purpose." - } - }, - "PROCESS_HISTORYLEVELPACKAGE" : { - "PROCESS_HISTORYLEVEL" : { - "TITLE" : "Set a specific history level for this process definition", - "DESCRIPTION" : "Set a specific history level for this process definition" - } - }, - "ISEXECUTABLEPACKAGE" : { - "ISEXECUTABLE" : { - "TITLE" : "Is executable", - "DESCRIPTION" : "Is the process executable?" - } - }, - "PROCESS_POTENTIALSTARTERUSERPACKAGE" : { - "PROCESS_POTENTIALSTARTERUSER" : { - "TITLE" : "Potential starter user", - "DESCRIPTION" : "Which user, can start the process?" - } - }, - "PROCESS_POTENTIALSTARTERGROUPPACKAGE" : { - "PROCESS_POTENTIALSTARTERGROUP" : { - "TITLE" : "Potential starter group", - "DESCRIPTION" : "Which group, can start the process?" - } - }, - "PROCESS_NAMESPACEPACKAGE" : { - "PROCESS_NAMESPACE" : { - "TITLE" : "Target namespace", - "DESCRIPTION" : "Target namespace for the process definition." - } - }, - "PROCESS_ISEAGEREXECUTIONFETCHPACKAGE" : { - "ISEAGEREXECUTIONFETCH" : { - "TITLE" : "Eager execution fetching", - "DESCRIPTION" : "Enable eager execution fetching for this process definition?" - } - }, - "ASYNCHRONOUSDEFINITIONPACKAGE" : { - "ASYNCHRONOUSDEFINITION" : { - "TITLE" : "Asynchronous", - "DESCRIPTION" : "Define the activity as asynchronous." - } - }, - "DATAPROPERTIESPACKAGE" : { - "DATAPROPERTIES" : { - "TITLE" : "Data Objects", - "DESCRIPTION" : "Definition of the data object properties" - } - }, - "EXCLUSIVEDEFINITIONPACKAGE" : { - "EXCLUSIVEDEFINITION" : { - "TITLE" : "Exclusive", - "DESCRIPTION" : "Define the activity as exclusive." - } - }, - "EXECUTIONLISTENERSPACKAGE" : { - "EXECUTIONLISTENERS" : { - "TITLE" : "Execution listeners", - "DESCRIPTION" : "Listeners for an activity, process, sequence flow, start and end event." - } - }, - "TASKLISTENERSPACKAGE" : { - "TASKLISTENERS" : { - "TITLE" : "Task listeners", - "DESCRIPTION" : "Listeners for a user task" - } - }, - "EVENTLISTENERSPACKAGE" : { - "EVENTLISTENERS" : { - "TITLE" : "Event listeners", - "DESCRIPTION" : "Listeners for any event happening in the Flowable Engine. It's also possible to rethrow the event as a signal, message or error event" - } - }, - "USERTASKASSIGNMENTPACKAGE" : { - "USERTASKASSIGNMENT" : { - "TITLE" : "Assignments", - "DESCRIPTION" : "Assignment definition for the user task" - } - }, - "FORMPROPERTIESPACKAGE" : { - "FORMPROPERTIES" : { - "TITLE" : "Form properties", - "DESCRIPTION" : "Definition of the form with a list of form properties" - } - }, - "FORMKEYDEFINITIONPACKAGE" : { - "FORMKEYDEFINITION" : { - "TITLE" : "Form key", - "DESCRIPTION" : "Form key that provides a reference to a form." - } - }, - "FORMFIELDVALIDATIONPACKAGE" : { - "FORMFIELDVALIDATION" : { - "TITLE" : "Validate form fields", - "DESCRIPTION" : "Validate form fields on the form submission. (allowed values are 'true', 'false' or expression)" - } - }, - "DUEDATEDEFINITIONPACKAGE" : { - "DUEDATEDEFINITION" : { - "TITLE" : "Due date", - "DESCRIPTION" : "Due date of the user task." - } - }, - "PRIORITYDEFINITIONPACKAGE" : { - "PRIORITYDEFINITION" : { - "TITLE" : "Priority", - "DESCRIPTION" : "Priority of the user task." - } - }, - "TASKIDVARIABLENAMEPACKAGE": { - "TASKIDVARIABLENAME": { - "TITLE": "ID variable", - "DESCRIPTION": "If set, the id of the task will be stored in this variable" - } - }, - "SERVICETASKCLASSPACKAGE" : { - "SERVICETASKCLASS" : { - "TITLE" : "Class", - "DESCRIPTION" : "Class that implements the service task logic." - } - }, - "SERVICETASKEXPRESSIONPACKAGE" : { - "SERVICETASKEXPRESSION" : { - "TITLE" : "Expression", - "DESCRIPTION" : "Service task logic defined with an expression." - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE" : { - "SERVICETASKDELEGATEEXPRESSION" : { - "TITLE" : "Delegate expression", - "DESCRIPTION" : "Service task logic defined with a delegate expression." - } - }, - "SERVICETASKFAILEDJOBRETRYTIMECYCLEPACKAGE" : { - "SERVICETASKFAILEDJOBRETRYTIMECYCLE" : { - "TITLE" : "Failed job retry time cycle", - "DESCRIPTION" : "Service task logic defined with a failed job retry time cycle." - } - }, - "SERVICETASKFIELDSPACKAGE" : { - "SERVICETASKFIELDS" : { - "TITLE" : "Class fields", - "DESCRIPTION" : "Field extensions" - } - }, - "SERVICETASKEXCEPTIONSPACKAGE" : { - "SERVICETASKEXCEPTIONS" : { - "TITLE" : "Exceptions", - "DESCRIPTION" : "Mapped Exceptions" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKRESULTVARIABLE" : { - "TITLE" : "Result variable name", - "DESCRIPTION" : "Process variable name to store the service task result." - }, - "SERVICETASKUSELOCALSCOPEFORRESULTVARIABLE" : { - "TITLE" : "Use local scope for result variable", - "DESCRIPTION" : "Flag that marks that the used resultVariable needs to be saved as a local variable" - } - }, - "SERVICETASKTRIGGERABLEPACKAGE" : { - "SERVICETASKTRIGGERABLE" : { - "TITLE" : "Set service task to be triggerable", - "DESCRIPTION" : "Sets the service task to be triggerable" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "Store result variable transiently", - "DESCRIPTION" : "Flag that marks that the result of the expression will not be persisted at the end of the database transaction." - } - }, - "SCRIPTFORMATPACKAGE" : { - "SCRIPTFORMAT" : { - "TITLE" : "Script format", - "DESCRIPTION" : "Script format of the script task." - } - }, - "SCRIPTTEXTPACKAGE" : { - "SCRIPTTEXT" : { - "TITLE" : "Script", - "DESCRIPTION" : "Script text of the script task." - } - }, - "SCRIPTAUTOSTOREVARIABLESPACKAGE" : { - "SCRIPTAUTOSTOREVARIABLES" : { - "TITLE" : "Auto Store Variables", - "DESCRIPTION" : "Automatically store all script variables to the process." - } - }, - "SHELLCOMMANDPACKAGE" : { - "SHELLCOMMAND" : { - "TITLE" : "Command", - "DESCRIPTION" : "Shell task command" - } - }, - "SHELLARG1PACKAGE" : { - "SHELLARG1" : { - "TITLE" : "Argument 1", - "DESCRIPTION" : "Shell command arg 1" - } - }, - "SHELLARG2PACKAGE" : { - "SHELLARG2" : { - "TITLE" : "Argument 2", - "DESCRIPTION" : "Shell command arg 2" - } - }, - "SHELLARG3PACKAGE" : { - "SHELLARG3" : { - "TITLE" : "Argument 3", - "DESCRIPTION" : "Shell command arg 3" - } - }, - "SHELLARG4PACKAGE" : { - "SHELLARG4" : { - "TITLE" : "Argument 4", - "DESCRIPTION" : "Shell command arg 4" - } - }, - "SHELLARG5PACKAGE" : { - "SHELLARG5" : { - "TITLE" : "Argument 5", - "DESCRIPTION" : "Shell command arg 5" - } - }, - "SHELLWAITPACKAGE" : { - "SHELLWAIT" : { - "TITLE" : "Wait", - "DESCRIPTION" : "Flag to wait for shell command execution end" - } - }, - "SHELLOUTPUTVARIABLEPACKAGE" : { - "SHELLOUTPUTVARIABLE" : { - "TITLE" : "Output variable", - "DESCRIPTION" : "Variable to store shell command output" - } - }, - "SHELLERRORCODEVARIABLEPACKAGE" : { - "SHELLERRORCODEVARIABLE" : { - "TITLE" : "Error code variable", - "DESCRIPTION" : "Variable to store shell command error code" - } - }, - "SHELLREDIRECTERRORPACKAGE" : { - "SHELLREDIRECTERROR" : { - "TITLE" : "Redirect error", - "DESCRIPTION" : "If true merge error output with standard output" - } - }, - "SHELLCLEANENVPACKAGE" : { - "SHELLCLEANENV" : { - "TITLE" : "Clean env", - "DESCRIPTION" : "Clean shell execution environment" - } - }, - "SHELLDIRECTORYPACKAGE" : { - "SHELLDIRECTORY" : { - "TITLE" : "Directory", - "DESCRIPTION" : "Shell process working directory" - } - }, - "RULETASK_RULESPACKAGE" : { - "RULETASK_RULES" : { - "TITLE" : "Rules", - "DESCRIPTION" : "Rules of the rule task." - } - }, - "RULETASK_VARIABLES_INPUTPACKAGE" : { - "RULETASK_VARIABLES_INPUT" : { - "TITLE" : "Input variables", - "DESCRIPTION" : "Input variables of the rule task." - } - }, - "RULETASK_EXCLUDEPACKAGE" : { - "RULETASK_EXCLUDE" : { - "TITLE" : "Exclude", - "DESCRIPTION" : "Use the rules property as exclusion." - } - }, - "RULETASK_RESULTPACKAGE" : { - "RULETASK_RESULT" : { - "TITLE" : "Result variable", - "DESCRIPTION" : "Result variable of the rule task." - } - }, - "MAILTASKHEADERSPACKAGE" : { - "MAILTASKHEADERS" : { - "TITLE" : "Headers", - "DESCRIPTION" : "Line separated Mail headers (For example - X-Attribute: value)." - } - }, - "MAILTASKTOPACKAGE" : { - "MAILTASKTO" : { - "TITLE" : "To", - "DESCRIPTION" : "The recipients if the e-mail. Multiple recipients are defined in a comma-separated list." - } - }, - "MAILTASKFROMPACKAGE" : { - "MAILTASKFROM" : { - "TITLE" : "From", - "DESCRIPTION" : "The sender e-mail address. If not provided, the default configured from address is used." - } - }, - "MAILTASKSUBJECTPACKAGE" : { - "MAILTASKSUBJECT" : { - "TITLE" : "Subject", - "DESCRIPTION" : "The subject of the e-mail." - } - }, - "MAILTASKCCPACKAGE" : { - "MAILTASKCC" : { - "TITLE" : "Cc", - "DESCRIPTION" : "The cc's of the e-mail. Multiple recipients are defined in a comma-separated list" - } - }, - "MAILTASKBCCPACKAGE" : { - "MAILTASKBCC" : { - "TITLE" : "Bcc", - "DESCRIPTION" : "The bcc's of the e-mail. Multiple recipients are defined in a comma-separated list" - } - }, - "MAILTASKTEXTPACKAGE" : { - "MAILTASKTEXT" : { - "TITLE" : "Text", - "DESCRIPTION" : "The content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative." - }, - "MAILTASKTEXTVAR" : { - "TITLE" : "TextVar", - "DESCRIPTION" : "The name of a process variable that holds the text that is the content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative." - } - }, - "MAILTASKHTMLPACKAGE" : { - "MAILTASKHTML" : { - "TITLE" : "Html", - "DESCRIPTION" : "A piece of HTML that is the content of the e-mail." - }, - "MAILTASKHTMLVAR" : { - "TITLE" : "HtmlVar", - "DESCRIPTION" : "The name of a process variable that holds the HTML that is the content of the e-mail." - } - }, - "MAILTASKCHARSETPACKAGE" : { - "MAILTASKCHARSET" : { - "TITLE" : "Charset", - "DESCRIPTION" : "Allows to change the charset of the email, which is necessary for many non-English languages. " - } - }, - "HTTPTASKREQUESTMETHODPACKAGE" : { - "HTTPTASKREQUESTMETHOD" : { - "TITLE" : "Request method", - "DESCRIPTION" : "Request method (For example - GET,POST,PUT etc)." - } - }, - "HTTPTASKREQUESTURLPACKAGE" : { - "HTTPTASKREQUESTURL" : { - "TITLE" : "Request URL", - "DESCRIPTION" : "Request URL (For example - http://flowable.org)." - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE" : { - "HTTPTASKREQUESTHEADERS" : { - "TITLE" : "Request headers", - "DESCRIPTION" : "Line separated HTTP request headers (For example - Content-Type: application/json)." - } - }, - "HTTPTASKREQUESTBODYPACKAGE" : { - "HTTPTASKREQUESTBODYPACKAGE" : { - "TITLE" : "Request body", - "DESCRIPTION" : "Request body (For example- ${sampleBody})." - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE" : { - "HTTPTASKREQUESTBODYENCODING" : { - "TITLE" : "Request body encoding", - "DESCRIPTION" : "Request body encoding (For example- UTF-8)." - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE" : { - "HTTPTASKREQUESTTIMEOUT" : { - "TITLE" : "Request timeout", - "DESCRIPTION" : "Timeout in milliseconds for the request (For example - 5000)." - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE" : { - "HTTPTASKDISALLOWREDIRECTS" : { - "TITLE" : "Disallow redirects", - "DESCRIPTION" : "Flag to disallow HTTP redirects." - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE" : { - "HTTPTASKFAILSTATUSCODES" : { - "TITLE" : "Fail status codes", - "DESCRIPTION" : "Comma separated list of HTTP response status codes to retry, for example 400,5XX." - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE" : { - "HTTPTASKHANDLESTATUSCODES" : { - "TITLE" : "Handle status codes", - "DESCRIPTION" : "Comma separated list of HTTP response status codes to ignore, for example 404,3XX." - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE" : { - "HTTPTASKIGNOREEXCEPTION" : { - "TITLE" : "Ignore exception", - "DESCRIPTION" : "Flag to ignore exceptions." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT" : { - "TITLE" : "Save response as a transient variable", - "DESCRIPTION" : "Flag indicating to store the response variable(s) transient" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE" : { - "HTTPTASKSAVERESPONSEASJSON" : { - "TITLE" : "Save response as JSON", - "DESCRIPTION" : "Flag indicating to store the response variable as a JSON variable instead of a String" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that when using parallel gateways multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the process is faster." - } - }, - "SKIPEXPRESSIONPACKAGE" : { - "SKIPEXPRESSION" : { - "TITLE" : "Skip expression", - "DESCRIPTION" : "Skip an expression execution associated with task or association or not." - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE" : { - "HTTPTASKRESPONSEVARIABLENAME" : { - "TITLE" : "Response variable name", - "DESCRIPTION" : "Define the variable name to store the http response." - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE" : { - "HTTPTASKSAVEREQUESTVARIABLES" : { - "TITLE" : "Save request variables", - "DESCRIPTION" : "Flag to save request variables." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERS" : { - "TITLE" : "Save response status, headers", - "DESCRIPTION" : "Flag to save response status, headers etc." - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE" : { - "HTTPTASKRESULTVARIABLEPREFIX" : { - "TITLE" : "Result variable prefix", - "DESCRIPTION" : "Prefix for the execution variable names." - } - }, - "CALLACTIVITYCALLEDELEMENTPACKAGE" : { - "CALLACTIVITYCALLEDELEMENT" : { - "TITLE" : "Called element", - "DESCRIPTION" : "Process reference." - } - }, - "CALLACTIVITYCALLEDELEMENTTYPEPACKAGE" : { - "CALLACTIVITYCALLEDELEMENTTYPE" : { - "TITLE" : "Called element type", - "DESCRIPTION" : "Type of the used process reference." - } - }, - "CALLACTIVITYINPARAMETERSPACKAGE" : { - "CALLACTIVITYINPARAMETERS" : { - "TITLE" : "In parameters", - "DESCRIPTION" : "Definition of the input parameters" - } - }, - "CALLACTIVITYOUTPARAMETERSPACKAGE" : { - "CALLACTIVITYOUTPARAMETERS" : { - "TITLE" : "Out parameters", - "DESCRIPTION" : "Definition of the output parameters" - } - }, - "CALLACTIVITYINHERITVARIABLESPACKAGE" : { - "CALLACTIVITYINHERITVARIABLES" : { - "TITLE" : "Inherit variables in sub process", - "DESCRIPTION" : "Inherit parent process variables in the sub process." - } - }, - "CALLACTIVITYSAMEDEPLOYMENTPACKAGE" : { - "CALLACTIVITYSAMEDEPLOYMENT" : { - "TITLE" : "Start the referenced process from the same deployment.", - "DESCRIPTION" : "Use the referenced process from the same deployment." - } - }, - "CALLACTIVITYFALLBACKTODEFAULTTENANTPACKAGE" : { - "CALLACTIVITYFALLBACKTODEFAULTTENANT" : { - "TITLE" : "Fallback to default tenant", - "DESCRIPTION" : "Look for the definition by key in the default tenant when current tenant search fails." - } - }, - "CALLACTIVITYIDVARIABLENAMEPACKAGE": { - "CALLACTIVITYIDVARIABLENAME": { - "TITLE": "ID variable", - "DESCRIPTION": "If set, the instance id of the started instance will be stored in this variable" - } - }, - "CALLACTIVITYPROCESSINSTANCENAMEPACKAGE" : { - "CALLACTIVITYPROCESSINSTANCENAME" : { - "TITLE" : "Process instance name", - "DESCRIPTION" : "An expression that resolves to the name of the child process instance" - } - }, - "CALLACTIVITYINHERITBUSINESSKEYPACKAGE" : { - "CALLACTIVITYINHERITBUSINESSKEY" : { - "TITLE" : "Inherit business key", - "DESCRIPTION" : "Inherit the business key from the parent process." - } - }, - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERSPACKAGE" : { - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERS" : { - "TITLE" : "Use local scope for out parameters", - "DESCRIPTION" : "Use local variable scope for out parameters." - } - }, - "CALLACTIVITYBUSINESSKEYPACKAGE" : { - "CALLACTIVITYBUSINESSKEY" : { - "TITLE" : "Business key expression", - "DESCRIPTION" : "An expression that resolves to a business key for the child process instance" - } - }, - "CALLACTIVITYCOMPLETEASYNCPACKAGE" : { - "CALLACTIVITYCOMPLETEASYNC" : { - "TITLE" : "Complete asynchronously", - "DESCRIPTION" : "If set, the child process ending and completing the call activity is done asynchronously. Useful when using parallel multi instance with a called process definition that has async tasks." - } - }, - "CAMELTASKCAMELCONTEXTPACKAGE" : { - "CAMELTASKCAMELCONTEXT" : { - "TITLE" : "Camel context", - "DESCRIPTION" : "An optional camel context definition, if left empty the default is used." - } - }, - "MULETASKENDPOINTURLPACKAGE" : { - "MULETASKENDPOINTURL" : { - "TITLE" : "Endpoint url", - "DESCRIPTION" : "A required endpoint url to sent the message to Mule." - } - }, - "MULETASKLANGUAGEPACKAGE" : { - "MULETASKLANGUAGE" : { - "TITLE" : "Language", - "DESCRIPTION" : "A required definition for the language to resolve the payload expression, like juel." - } - }, - "MULETASKPAYLOADEXPRESSIONPACKAGE" : { - "MULETASKPAYLOADEXPRESSION" : { - "TITLE" : "Payload expression", - "DESCRIPTION" : "A required definition for the payload of the message sent to Mule." - } - }, - "MULETASKRESULTVARIABLEPACKAGE" : { - "MULETASKRESULTVARIABLE" : { - "TITLE" : "Result variable", - "DESCRIPTION" : "An optional result variable for the payload returned." - } - }, - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "TITLE" : "Flow condition", - "DESCRIPTION" : "The condition of the sequence flow" - } - }, - "DEFAULTFLOWPACKAGE" : { - "DEFAULTFLOW" : { - "TITLE" : "Default flow", - "DESCRIPTION" : "Define the sequence flow as default" - } - }, - "CONDITIONALFLOWPACKAGE" : { - "CONDITIONALFLOW" : { - "TITLE" : "Conditional flow", - "DESCRIPTION" : "Define the sequence flow with a condition" - } - }, - "TIMERCYCLEDEFINITIONPACKAGE" : { - "TIMERCYCLEDEFINITION" : { - "TITLE" : "Time cycle (e.g. R3/PT10H)", - "DESCRIPTION" : "Define the timer with a ISO-8601 cycle." - } - }, - "TIMERDATEDEFINITIONPACKAGE" : { - "TIMERDATEDEFINITION" : { - "TITLE" : "Time date in ISO-8601", - "DESCRIPTION" : "Define the timer with a ISO-8601 date definition." - } - }, - "TIMERDURATIONDEFINITIONPACKAGE" : { - "TIMERDURATIONDEFINITION" : { - "TITLE" : "Time duration (e.g. PT5M)", - "DESCRIPTION" : "Define the timer with a ISO-8601 duration." - } - }, - "TIMERENDDATEDEFINITIONPACKAGE" : { - "TIMERENDDATEDEFINITION" : { - "TITLE" : "Time End Date in ISO-8601", - "DESCRIPTION" : "Define the timer with a ISO-8601 duration." - } - }, - "MESSAGEREFPACKAGE" : { - "MESSAGEREF" : { - "TITLE" : "Message reference", - "DESCRIPTION" : "Define the message name." - } - }, - "MESSAGEEXPRESSIONPACKAGE" : { - "MESSAGEEXPRESSION" : { - "TITLE" : "Message expression", - "DESCRIPTION" : "Resolves the message event at runtime based on an expression." - } - }, - "SIGNALREFPACKAGE" : { - "SIGNALREF" : { - "TITLE" : "Signal reference", - "DESCRIPTION" : "Define the signal name." - } - }, - "COMPENSATIONACTIVITYREFPACKAGE" : { - "COMPENSATIONACTIVITYREF" : { - "TITLE" : "Compensation activity reference", - "DESCRIPTION" : "Define the activity reference." - } - }, - "SIGNALEXPRESSIONPACKAGE" : { - "SIGNALEXPRESSION" : { - "TITLE" : "Signal expression", - "DESCRIPTION" : "Resolves the signal event at runtime based on an expression." - } - }, - "ERRORREFPACKAGE" : { - "ERRORREF" : { - "TITLE" : "Error reference", - "DESCRIPTION" : "Define the error name." - } - }, - "ERRORVARIABLEPACKAGE" : { - "ERRORVARIABLENAME" : { - "TITLE" : "Error variable name", - "DESCRIPTION" : "Stores the bpmn error code to a variable with the given name." - }, - "ERRORVARIABLETRANSIENT" : { - "TITLE" : "Error variable transient", - "DESCRIPTION" : "Flag defines whether the defined error variable will be stored transiently." - }, - "ERRORVARIABLELOCALSCOPE" : { - "TITLE" : "Error variable local scope", - "DESCRIPTION" : "Flag defines whether defined error variable will be stored to a local scope." - } - }, - "ESCALATIONREFPACKAGE" : { - "ESCALATIONREF" : { - "TITLE" : "Escalation reference", - "DESCRIPTION" : "Define the escalation name." - } - }, - "CONDITIONALEVENTPACKAGE" : { - "CONDITION" : { - "TITLE" : "Condition expression", - "DESCRIPTION" : "Define the condition expression for the conditional event." - } - }, - "CANCELACTIVITYPACKAGE" : { - "CANCELACTIVITY" : { - "TITLE" : "Cancel activity", - "DESCRIPTION" : "Should the activity be cancelled" - } - }, - "INITIATORPACKAGE" : { - "INITIATOR" : { - "TITLE" : "Initiator", - "DESCRIPTION" : "Initiator of the process." - } - }, - "TEXTPACKAGE" : { - "TEXT" : { - "TITLE" : "Text", - "DESCRIPTION" : "The text of the text annotation." - } - }, - "MULTIINSTANCE_TYPEPACKAGE" : { - "MULTIINSTANCE_TYPE" : { - "TITLE" : "Multi-instance type", - "DESCRIPTION" : "Repeated activity execution (parallel or sequential) can be displayed through different loop types" - }, - "VARIABLE_AGGREGATIONS" : { - "TITLE" : "Variable aggregations (Multi-instance)", - "DESCRIPTION" : "Variable aggregation definition for when the multi instance completes." - } - }, - "MULTIINSTANCE_CARDINALITYPACKAGE" : { - "MULTIINSTANCE_CARDINALITY" : { - "TITLE" : "Cardinality (Multi-instance)", - "DESCRIPTION" : "Define the cardinality of multi instance." - } - }, - "MULTIINSTANCE_COLLECTIONPACKAGE" : { - "MULTIINSTANCE_COLLECTION" : { - "TITLE" : "Collection (Multi-instance)", - "DESCRIPTION" : "Define the collection for the multi instance." - } - }, - "MULTIINSTANCE_VARIABLEPACKAGE" : { - "MULTIINSTANCE_VARIABLE" : { - "TITLE" : "Element variable (Multi-instance)", - "DESCRIPTION" : "Define the element variable for the multi instance." - } - }, - "MULTIINSTANCE_CONDITIONPACKAGE" : { - "MULTIINSTANCE_CONDITION" : { - "TITLE" : "Completion condition (Multi-instance)", - "DESCRIPTION" : "Define the completion condition for the multi instance." - } - }, - "ISFORCOMPENSATIONPACKAGE" : { - "ISFORCOMPENSATION" : { - "TITLE" : "Is for compensation", - "DESCRIPTION" : "A flag that identifies whether this activity is intended for the purposes of compensation." - } - }, - "SEQUENCEFLOWORDERPACKAGE" : { - "SEQUENCEFLOWORDER" : { - "TITLE" : "Flow order", - "DESCRIPTION" : "Order outgoing sequence flows." - } - }, - "SIGNALDEFINITIONSPACKAGE" : { - "SIGNALDEFINITIONS" : { - "TITLE" : "Signal definitions", - "DESCRIPTION" : "Signal definitions" - } - }, - "MESSAGEDEFINITIONSPACKAGE" : { - "MESSAGEDEFINITIONS" : { - "TITLE" : "Message definitions", - "DESCRIPTION" : "Message definitions" - } - }, - "ESCALATIONDEFINITIONSPACKAGE" : { - "ESCALATIONDEFINITIONS" : { - "TITLE" : "Escalation definitions", - "DESCRIPTION" : "Escalation definitions" - } - }, - "EVENTREGISTRYPACKAGE" : { - "EVENTKEY" : { - "TITLE" : "Event key", - "DESCRIPTION" : "Definition of the event key" - }, - "EVENTNAME" : { - "TITLE" : "Event name", - "DESCRIPTION" : "Definition of the event name" - }, - "EVENTINPARAMETERS" : { - "TITLE" : "Mapping to event payload", - "DESCRIPTION" : "Mapping of the process variables to event payload properties" - }, - "EVENTOUTPARAMETERS" : { - "TITLE" : "Mapping from event payload", - "DESCRIPTION" : "Mapping of the event payload properties to process variables" - }, - "EVENTCORRELATIONPARAMETERS" : { - "TITLE" : "Correlation parameters", - "DESCRIPTION" : "Definition of the correlation parameters" - }, - "CHANNELKEY" : { - "TITLE" : "Channel key", - "DESCRIPTION" : "Definition of the channel key" - }, - "CHANNELNAME" : { - "TITLE" : "Channel name", - "DESCRIPTION" : "Definition of the channel name" - }, - "CHANNELTYPE" : { - "TITLE" : "Channel type", - "DESCRIPTION" : "Definition of the channel type" - }, - "CHANNELDESTINATION" : { - "TITLE" : "Channel destination", - "DESCRIPTION" : "Definition of the channel destination" - }, - "TRIGGEREVENTKEY" : { - "TITLE" : "Trigger event key", - "DESCRIPTION" : "Definition of the trigger event key" - }, - "TRIGGEREVENTNAME" : { - "TITLE" : "Trigger event name", - "DESCRIPTION" : "Definition of the trigger event name" - }, - "TRIGGERCHANNELKEY" : { - "TITLE" : "Trigger channel key", - "DESCRIPTION" : "Definition of the trigger channel key" - }, - "TRIGGERCHANNELNAME" : { - "TITLE" : "Trigger channel name", - "DESCRIPTION" : "Definition of the trigger channel name" - }, - "TRIGGERCHANNELTYPE" : { - "TITLE" : "Trigger channel type", - "DESCRIPTION" : "Definition of the trigger channel type" - }, - "TRIGGERCHANNELDESTINATION" : { - "TITLE" : "Trigger channel destination", - "DESCRIPTION" : "Definition of the trigger channel destination" - }, - "KEYDETECTIONFIXEDVALUE" : { - "TITLE" : "Event key fixed value", - "DESCRIPTION" : "Definition of the event key fixed value" - }, - "KEYDETECTIONJSONFIELD" : { - "TITLE" : "Event key json field", - "DESCRIPTION" : "Definition of the event key detection with a json field" - }, - "KEYDETECTIONJSONPOINTER" : { - "TITLE" : "Event key json pointer", - "DESCRIPTION" : "Definition of the event key detection with a json pointer expression" - } - }, - "VARIABLELISTENERPACKAGE": { - "VARIABLENAME" : { - "TITLE" : "Variable name", - "DESCRIPTION" : "Defines the variable that will be watched for value changes" - }, - "VARIABLECHANGETYPE" : { - "TITLE" : "Variable change type", - "DESCRIPTION" : "Configures for which change type the variable listener will be triggered" - } - }, - "EXTERNALWORKERJOBPACKAGE": { - "TOPIC": { - "TITLE": "Job topic", - "DESCRIPTION": "The job topic that the external worker will query jobs on" - } - }, - "ISTRANSACTIONPACKAGE" : { - "ISTRANSACTION" : { - "TITLE" : "Is a transaction sub process", - "DESCRIPTION" : "A flag that identifies whether this sub process is of type transaction." - } - }, - "FORMREFERENCEPACKAGE" : { - "FORMREFERENCE" : { - "TITLE" : "Form reference", - "DESCRIPTION" : "Reference to a form" - } - }, - "TERMINATEALLPACKAGE" : { - "TERMINATEALL" : { - "TITLE" : "Terminate all", - "DESCRIPTION" : "Enable to terminate the process instance" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE" : { - "DECISIONTASKDECISIONTABLEREFERENCE" : { - "TITLE" : "Decision table reference", - "DESCRIPTION" : "Set the decision table reference" - } - }, - "DECISIONTASKDECISIONSERVICEREFERENCEPACKAGE" : { - "DECISIONTASKDECISIONSERVICEREFERENCE" : { - "TITLE" : "Decision service reference", - "DESCRIPTION" : "Set the decision service reference" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE" : { - "DECISIONTASKTHROWERRORONNOHITS" : { - "TITLE" : "Throw error if no rules were hit", - "DESCRIPTION" : "Should an error be thrown if no rules of the decision table were hit and consequently no result was found." - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE" : { - "DECISIONTASKFALLBACKTODEFAULTTENANT" : { - "TITLE" : "Fallback to default tenant", - "DESCRIPTION" : "Find decision definition without tenant when previous attempts to find it with tenant failed." - } - }, - "INTERRUPTINGPACKAGE" : { - "INTERRUPTING" : { - "TITLE" : "Interrupting", - "DESCRIPTION" : "Should all parent executions be terminated?" - } - }, - "COMPLETIONCONDITIONPACKAGE" : { - "COMPLETIONCONDITION" : { - "TITLE" : "Completion condition", - "DESCRIPTION" : "The completion condition for the adhoc sub process" - } - }, - "ORDERINGPACKAGE" : { - "ORDERING" : { - "TITLE" : "Ordering", - "DESCRIPTION" : "The ordering for the adhoc sub process" - } - }, - "CANCELREMAININGINSTANCESPACKAGE" : { - "CANCELREMAININGINSTANCES" : { - "TITLE" : "Cancel remaining instances", - "DESCRIPTION" : "Cancel the remaining instances for the adhoc sub process?" - } - } - - }, - "STENCILS" : { - "GROUPS" : { - "STARTEVENTS" : "Start Events", - "ENDEVENTS" : "End Events", - "DIAGRAM" : "Diagram", - "ACTIVITIES" : "Activities", - "STRUCTURAL" : "Structural", - "GATEWAYS" : "Gateways", - "BOUNDARYEVENTS" : "Boundary Events", - "INTERMEDIATECATCHINGEVENTS" : "Intermediate Catching Events", - "INTERMEDIATETHROWINGEVENTS" : "Intermediate Throwing Events", - "SWIMLANES" : "Swimlanes", - "CONNECTINGOBJECTS" : "Connecting Objects", - "ARTIFACTS" : "Artifacts" - }, - "BPMNDIAGRAM" : { - "TITLE" : "BPMN-Diagram", - "DESCRIPTION" : "A BPMN 2.0 diagram." - }, - "STARTNONEEVENT" : { - "TITLE" : "Start event", - "DESCRIPTION" : "A start event without a specific trigger" - }, - "STARTTIMEREVENT" : { - "TITLE" : "Start timer event", - "DESCRIPTION" : "A start event with a timer trigger" - }, - "STARTSIGNALEVENT" : { - "TITLE" : "Start signal event", - "DESCRIPTION" : "A start event with a signal trigger" - }, - "STARTMESSAGEEVENT" : { - "TITLE" : "Start message event", - "DESCRIPTION" : "A start event with a message trigger" - }, - "STARTEVENTREGISTRYEVENT" : { - "TITLE" : "Start event registry event", - "DESCRIPTION" : "A start event with an event registry trigger" - }, - "STARTVARIABLELISTENEREVENT" : { - "TITLE" : "Start variable listener event", - "DESCRIPTION" : "A start event that is triggered when the configured variable value changes" - }, - "STARTCONDITIONALEVENT" : { - "TITLE" : "Start conditional event", - "DESCRIPTION" : "A start event that evaluates a conditional event" - }, - "STARTERROREVENT" : { - "TITLE" : "Start error event", - "DESCRIPTION" : "A start event that catches a thrown BPMN error" - }, - "STARTESCALATIONEVENT" : { - "TITLE" : "Start escalation event", - "DESCRIPTION" : "A start event that catches a thrown BPMN escalation" - }, - "USERTASK" : { - "TITLE" : "User task", - "DESCRIPTION" : "A manual task assigned to a specific person" - }, - "SERVICETASK" : { - "TITLE" : "Service task", - "DESCRIPTION" : "An automatic task with service logic" - }, - "SCRIPTTASK" : { - "TITLE" : "Script task", - "DESCRIPTION" : "An automatic task with script logic" - }, - "BUSINESSRULE" : { - "TITLE" : "Business rule task", - "DESCRIPTION" : "An automatic task with rule logic" - }, - "RECEIVETASK" : { - "TITLE" : "Receive task", - "DESCRIPTION" : "An task that waits for a signal" - }, - "RECEIVEEVENTTASK" : { - "TITLE" : "Receive event task", - "DESCRIPTION" : "An task that receives an event" - }, - "MANUALTASK" : { - "TITLE" : "Manual task", - "DESCRIPTION" : "An automatic task with no logic" - }, - "MAILTASK" : { - "TITLE" : "Mail task", - "DESCRIPTION" : "An mail task" - }, - "CAMELTASK" : { - "TITLE" : "Camel task", - "DESCRIPTION" : "An task that sends a message to Camel" - }, - "HTTPTASK" : { - "TITLE" : "Http task", - "DESCRIPTION" : "A HTTP task" - }, - "MULETASK" : { - "TITLE" : "Mule task", - "DESCRIPTION" : "An task that sends a message to Mule" - }, - "SENDTASK" : { - "TITLE" : "Send task", - "DESCRIPTION" : "An task that sends a message" - }, - "DECISIONTASK" : { - "TITLE" : "Decision task", - "DESCRIPTION" : "Task to use the Flowable DMN rule engine" - }, - "SENDEVENTTASK" : { - "TITLE" : "Send event task", - "DESCRIPTION" : "An task that sends an event to the event registry" - }, - "EXTERNALWORKERTASK" : { - "TITLE" : "External Worker task", - "DESCRIPTION" : "An task that creates a job which can be executed by an external worker" - }, - "SHELLTASK" : { - "TITLE" : "Shell task", - "DESCRIPTION" : "An automatic task with shell batch logic" - }, - "SUBPROCESS" : { - "TITLE" : "Sub process", - "DESCRIPTION" : "A sub process scope" - }, - "COLLAPSEDSUBPROCESS" : { - "TITLE" : "Collapsed Sub process", - "DESCRIPTION" : "A sub process scope" - }, - "EVENTSUBPROCESS" : { - "TITLE" : "Event sub process", - "DESCRIPTION" : "A event sub process scope" - }, - "CALLACTIVITY" : { - "TITLE" : "Call activity", - "DESCRIPTION" : "A call activity" - }, - "EXCLUSIVEGATEWAY" : { - "TITLE" : "Exclusive gateway", - "DESCRIPTION" : "A choice gateway" - }, - "PARALLELGATEWAY" : { - "TITLE" : "Parallel gateway", - "DESCRIPTION" : "A parallel gateway" - }, - "INCLUSIVEGATEWAY" : { - "TITLE" : "Inclusive gateway", - "DESCRIPTION" : "An inclusive gateway" - }, - "EVENTGATEWAY" : { - "TITLE" : "Event gateway", - "DESCRIPTION" : "An event gateway" - }, - "BOUNDARYCONDITIONALEVENT" : { - "TITLE" : "Boundary conditional event", - "DESCRIPTION" : "A boundary event that evaluates a conditional event" - }, - "BOUNDARYERROREVENT" : { - "TITLE" : "Boundary error event", - "DESCRIPTION" : "A boundary event that catches a BPMN error" - }, - "BOUNDARYESCALATIONEVENT" : { - "TITLE" : "Boundary escalation event", - "DESCRIPTION" : "A boundary event that catches a BPMN escalation" - }, - "BOUNDARYTIMEREVENT" : { - "TITLE" : "Boundary timer event", - "DESCRIPTION" : "A boundary event with a timer trigger" - }, - "BOUNDARYSIGNALEVENT" : { - "TITLE" : "Boundary signal event", - "DESCRIPTION" : "A boundary event with a signal trigger" - }, - "BOUNDARYMESSAGEEVENT" : { - "TITLE" : "Boundary message event", - "DESCRIPTION" : "A boundary event with a message trigger" - }, - "BOUNDARYCANCELEVENT" : { - "TITLE" : "Boundary cancel event", - "DESCRIPTION" : "A boundary cancel event" - }, - "BOUNDARYEVENTREGISTRYEVENT" : { - "TITLE" : "Boundary event registry event", - "DESCRIPTION" : "A boundary event registry event" - }, - "BOUNDARYVARIABLELISTENEREVENT" : { - "TITLE" : "Boundary variable listener event", - "DESCRIPTION" : "A boundary variable listener event that is triggered when the configured variable value changes" - }, - "BOUNDARYCOMPENSATIONEVENT" : { - "TITLE" : "Boundary compensation event", - "DESCRIPTION" : "A boundary compensation event" - }, - "CATCHTIMEREVENT" : { - "TITLE" : "Intermediate timer catching event", - "DESCRIPTION" : "An intermediate catching event with a timer trigger" - }, - "CATCHSIGNALEVENT" : { - "TITLE" : "Intermediate signal catching event", - "DESCRIPTION" : "An intermediate catching event with a signal trigger" - }, - "CATCHMESSAGEEVENT" : { - "TITLE" : "Intermediate message catching event", - "DESCRIPTION" : "An intermediate catching event with a message trigger" - }, - "CATCHCONDITIONALEVENT" : { - "TITLE" : "Intermediate conditional catching event", - "DESCRIPTION" : "An intermediate catching event with a conditional trigger" - }, - "CATCHEVENTREGISTRYEVENT" : { - "TITLE" : "Intermediate event registry catching event", - "DESCRIPTION" : "An intermediate catching event waiting to receive an event from the event registry" - }, - "CATCHVARIABLELISTENEREVENT": { - "TITLE" : "Intermediate variable listener catching event", - "DESCRIPTION" : "An intermediate catching event waiting to receive an event when the configured variable is changed" - }, - "THROWNONEEVENT" : { - "TITLE" : "Intermediate none throwing event", - "DESCRIPTION" : "An intermediate event without a specific trigger" - }, - "THROWSIGNALEVENT" : { - "TITLE" : "Intermediate signal throwing event", - "DESCRIPTION" : "An intermediate event with a signal trigger" - }, - "THROWESCALATIONEVENT" : { - "TITLE" : "Intermediate escalation throwing event", - "DESCRIPTION" : "An intermediate event with an escalation trigger" - }, - "THROWCOMPENSATIONEVENT": { - "TITLE" : "Intermediate compensation throwing event", - "DESCRIPTION" : "An intermediate event with a compensation trigger" - }, - "ENDNONEEVENT" : { - "TITLE" : "End event", - "DESCRIPTION" : "An end event without a specific trigger" - }, - "ENDERROREVENT" : { - "TITLE" : "End error event", - "DESCRIPTION" : "An end event that throws an error event" - }, - "ENDESCALATIONEVENT" : { - "TITLE" : "End escalation event", - "DESCRIPTION" : "An end event that throws an escalation event" - }, - "ENDCANCELEVENT" : { - "TITLE" : "End cancel event", - "DESCRIPTION" : "A cancel end event" - }, - "ENDTERMINATEEVENT" : { - "TITLE" : "End terminate event", - "DESCRIPTION" : "A terminate end event" - }, - "POOL" : { - "TITLE" : "Pool", - "DESCRIPTION" : "A pool to structure the process definition" - }, - "LANE" : { - "TITLE" : "Lane", - "DESCRIPTION" : "A lane to structure the process definition" - }, - "SEQUENCEFLOW" : { - "TITLE" : "Sequence flow", - "DESCRIPTION" : "Sequence flow defines the execution order of activities." - }, - "MESSAGEFLOW" : { - "TITLE" : "Message flow", - "DESCRIPTION" : "Message flow to connect elements in different pools." - }, - "ASSOCIATION" : { - "TITLE" : "Association", - "DESCRIPTION" : "Associates a text annotation with an element." - }, - "DATAASSOCIATION" : { - "TITLE" : "DataAssociation", - "DESCRIPTION" : "Associates a data element with an activity." - }, - "TEXTANNOTATION" : { - "TITLE" : "Text annotation", - "DESCRIPTION" : "Annotates elements with description text." - }, - "DATASTORE" : { - "TITLE" : "Data store", - "DESCRIPTION" : "Reference to a data store." - }, - "ADHOCSUBPROCESS" : { - "TITLE" : "Adhoc sub process", - "DESCRIPTION" : "An adhoc sub process" - } - } - }, - - "CMMN" : { - "TITLE": "CMMN editor", - "DESCRIPTION": "CMMN case editor", - "PROPERTYPACKAGES": { - "CASE_IDPACKAGE": { - "CASE_ID": { - "TITLE": "Case identifier", - "DESCRIPTION": "Unique identifier of the case definition." - } - }, - "OVERRIDEIDPACKAGE": { - "OVERRIDEID": { - "TITLE": "Id", - "DESCRIPTION": "Unique identifier of the element." - } - }, - "NAMEPACKAGE": { - "NAME": { - "TITLE": "Name", - "DESCRIPTION": "The descriptive name of the CMMN element." - } - }, - "DOCUMENTATIONPACKAGE": { - "DOCUMENTATION": { - "TITLE": "Documentation", - "DESCRIPTION": "The descriptive name of the CMMN element." - } - }, - "BLOCKINGPACKAGE": { - "ISBLOCKING": { - "TITLE": "Blocking", - "DESCRIPTION": "Boolean property, default true. If false the task will automatically complete the task after executing any associated logic" - }, - "ISBLOCKINGEXPRESSION": { - "TITLE": "Blocking expression", - "DESCRIPTION": "An expression to control at runtime whether this task is blocking or not. When set, the value of the blocking property is ignored." - } - }, - "CASE_INITIATORVARIABLENAMEPACKAGE": { - "CASE_INITIATORVARIABLENAME": { - "TITLE": "Initiator variable name", - "DESCRIPTION": "Sets the variable name to be used for the case initiator value." - } - }, - "CASE_AUTHORPACKAGE": { - "CASE_AUTHOR": { - "TITLE": "Case author", - "DESCRIPTION": "Author of the case definition." - } - }, - "CASE_VERSIONPACKAGE": { - "CASE_VERSION": { - "TITLE": "Case version string (documentation only)", - "DESCRIPTION": "Version identifier for documentation purpose." - } - }, - "CASE_NAMESPACEPACKAGE": { - "CASE_NAMESPACE": { - "TITLE": "Target namespace", - "DESCRIPTION": "Target namespace for the case definition." - } - }, - "USERTASKASSIGNMENTPACKAGE": { - "USERTASKASSIGNMENT": { - "TITLE": "Assignments", - "DESCRIPTION": "Assignment definition for the user task" - } - }, - "TASKLISTENERSPACKAGE": { - "TASKLISTENERS": { - "TITLE": "Task listeners", - "DESCRIPTION": "Listeners for a human task" - } - }, - "FORMPROPERTIESPACKAGE": { - "FORMPROPERTIES": { - "TITLE": "Form properties", - "DESCRIPTION": "Definition of the form with a list of form properties" - } - }, - "FORMKEYDEFINITIONPACKAGE": { - "FORMKEYDEFINITION": { - "TITLE": "Form key", - "DESCRIPTION": "Form key that provides a reference to a form." - } - }, - "FORMFIELDVALIDATIONPACKAGE": { - "FORMFIELDVALIDATION": { - "TITLE": "Validate form fields", - "DESCRIPTION": "Validate form fields on the form submission. (allowed values are 'true', 'false' or expression)" - } - }, - "DUEDATEDEFINITIONPACKAGE": { - "DUEDATEDEFINITION": { - "TITLE": "Due date", - "DESCRIPTION": "Due date of the user task." - } - }, - "PRIORITYDEFINITIONPACKAGE": { - "PRIORITYDEFINITION": { - "TITLE": "Priority", - "DESCRIPTION": "Priority of the user task." - } - }, - "TASKIDVARIABLENAMEPACKAGE": { - "TASKIDVARIABLENAME": { - "TITLE": "ID variable", - "DESCRIPTION": "If set, the id of the task will be stored in this variable" - } - }, - "SERVICETASKCLASSPACKAGE": { - "SERVICETASKCLASS": { - "TITLE": "Class", - "DESCRIPTION": "Class that implements the service task logic." - } - }, - "SERVICETASKEXPRESSIONPACKAGE": { - "SERVICETASKEXPRESSION": { - "TITLE": "Expression", - "DESCRIPTION": "Service task logic defined with an expression." - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE": { - "SERVICETASKDELEGATEEXPRESSION": { - "TITLE": "Delegate expression", - "DESCRIPTION": "Service task logic defined with a delegate expression." - } - }, - "SERVICETASKFIELDSPACKAGE": { - "SERVICETASKFIELDS": { - "TITLE": "Class fields", - "DESCRIPTION": "Field extensions" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE": { - "SERVICETASKRESULTVARIABLE": { - "TITLE": "Result variable name", - "DESCRIPTION": "Process variable name to store the service task result." - } - }, - "ASYNCPACKAGE": { - "ISASYNC": { - "TITLE": "Asynchronous", - "DESCRIPTION": "Indicates if the task needs to be executed asynchronously." - }, - "ISEXCLUSIVE": { - "TITLE": "Exclusive", - "DESCRIPTION": "Indicates if an asynchronous task must be executed exclusively" - } - }, - "MAILTASKHEADERSPACKAGE": { - "MAILTASKHEADERS": { - "TITLE": "Headers", - "DESCRIPTION": "Line separated Mail headers (For example - X-Attribute: value)." - } - }, - "MAILTASKTOPACKAGE": { - "MAILTASKTO": { - "TITLE": "To", - "DESCRIPTION": "The recipients if the e-mail. Multiple recipients are defined in a comma-separated list." - } - }, - "MAILTASKFROMPACKAGE": { - "MAILTASKFROM": { - "TITLE": "From", - "DESCRIPTION": "The sender e-mail address. If not provided, the default configured from address is used." - } - }, - "MAILTASKSUBJECTPACKAGE": { - "MAILTASKSUBJECT": { - "TITLE": "Subject", - "DESCRIPTION": "The subject of the e-mail." - } - }, - "MAILTASKCCPACKAGE": { - "MAILTASKCC": { - "TITLE": "Cc", - "DESCRIPTION": "The cc's of the e-mail. Multiple recipients are defined in a comma-separated list" - } - }, - "MAILTASKBCCPACKAGE": { - "MAILTASKBCC": { - "TITLE": "Bcc", - "DESCRIPTION": "The bcc's of the e-mail. Multiple recipients are defined in a comma-separated list" - } - }, - "MAILTASKTEXTPACKAGE": { - "MAILTASKTEXT": { - "TITLE": "Text", - "DESCRIPTION": "The content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative." - }, - "MAILTASKTEXTVAR" : { - "TITLE" : "TextVar", - "DESCRIPTION" : "The name of a case variable that holds the text that is the content of the e-mail, in case one needs to send plain none-rich e-mails. Can be used in combination with html, for e-mail clients that don't support rich content. The client will then fall back to this text-only alternative." - } - }, - "MAILTASKHTMLPACKAGE": { - "MAILTASKHTML": { - "TITLE": "Html", - "DESCRIPTION": "A piece of HTML that is the content of the e-mail." - }, - "MAILTASKHTMLVAR" : { - "TITLE" : "HtmlVar", - "DESCRIPTION" : "The name of a case variable that holds the HTML that is the content of the e-mail." - } - }, - "MAILTASKCHARSETPACKAGE": { - "MAILTASKCHARSET": { - "TITLE": "Charset", - "DESCRIPTION": "Allows to change the charset of the email, which is necessary for many non-English languages. " - } - }, - "TEXTPACKAGE": { - "TEXT": { - "TITLE": "TEXT", - "DESCRIPTION": "The text of the text annotation." - } - }, - "FORMREFERENCEPACKAGE": { - "FORMREFERENCE": { - "TITLE": "Form reference", - "DESCRIPTION": "Reference to a form" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONTABLEREFERENCE": { - "TITLE": "Decision table reference", - "DESCRIPTION": "Set the decision table reference" - } - }, - "DECISIONTASKDECISIONSERVICEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONSERVICEREFERENCE": { - "TITLE": "Decision service reference", - "DESCRIPTION": "Set the decision service reference" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE": { - "DECISIONTASKTHROWERRORONNOHITS": { - "TITLE": "Throw error if no rules were hit", - "DESCRIPTION": "Should an error be thrown if no rules of the decision table were hit and consequently no result was found." - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE": { - "DECISIONTASKFALLBACKTODEFAULTTENANT": { - "TITLE": "Fallback to default tenant", - "DESCRIPTION": "Find decision definition without tenant when previous attempts to find it with tenant failed." - } - }, - "HTTPTASKREQUESTMETHODPACKAGE": { - "HTTPTASKREQUESTMETHOD": { - "TITLE": "Request method", - "DESCRIPTION": "Request method (For example - GET,POST,PUT etc)." - } - }, - "HTTPTASKREQUESTURLPACKAGE": { - "HTTPTASKREQUESTURL": { - "TITLE": "Request URL", - "DESCRIPTION": "Request URL (For example - http://flowable.org)" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE": { - "HTTPTASKREQUESTHEADERS": { - "TITLE": "Request headers", - "DESCRIPTION": "Line separated HTTP request headers (For example - Content-Type: application/json)." - } - }, - "HTTPTASKREQUESTBODYPACKAGE": { - "HTTPTASKREQUESTBODY": { - "TITLE": "Request body", - "DESCRIPTION": "Request body (For example- ${sampleBody})." - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE": { - "HTTPTASKREQUESTBODYENCODING": { - "TITLE": "Request body encoding", - "DESCRIPTION": "Request body encoding (For example- UTF-8)." - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE": { - "HTTPTASKREQUESTTIMEOUT": { - "TITLE": "Request timeout", - "DESCRIPTION": "Timeout in milliseconds for the request (For example - 5000)." - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE": { - "HTTPTASKDISALLOWREDIRECTS": { - "TITLE": "Disallow redirects", - "DESCRIPTION": "Flag to disallow HTTP redirects." - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE": { - "HTTPTASKFAILSTATUSCODES": { - "TITLE": "Fail status codes", - "DESCRIPTION": "Comma separated list of HTTP response status codes to retry, for example 400,5XX." - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE": { - "HTTPTASKHANDLESTATUSCODES": { - "TITLE": "Handle status codes", - "DESCRIPTION": "Comma separated list of HTTP response status codes to ignore, for example 404,3XX." - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE": { - "HTTPTASKIGNOREEXCEPTION": { - "TITLE": "Ignore exception", - "DESCRIPTION": "Flag to ignore exceptions." - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE": { - "HTTPTASKRESPONSEVARIABLENAME": { - "TITLE": "Response variable name", - "DESCRIPTION": "Define the variable name to store the http response." - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE": { - "HTTPTASKSAVEREQUESTVARIABLES": { - "TITLE": "Save request variables", - "DESCRIPTION": "Flag to save request variables." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERS": { - "TITLE": "Save response status, headers", - "DESCRIPTION": "Flag to save response status, headers etc." - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE": { - "HTTPTASKRESULTVARIABLEPREFIX": { - "TITLE": "Result variable prefix", - "DESCRIPTION": "Prefix for the execution variable names." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT": { - "TITLE": "Save response as a transient variable", - "DESCRIPTION": "Flag indicating to store the response variable(s) transient" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE": { - "HTTPTASKSAVERESPONSEASJSON": { - "TITLE": "Save response as JSON", - "DESCRIPTION": "Flag indicating to store the response variable as a JSON variable instead of a String" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the case is faster." - } - }, - "EVENTREGISTRYPACKAGE" : { - "EVENTKEY" : { - "TITLE" : "Event key", - "DESCRIPTION" : "Definition of the event key" - }, - "EVENTNAME" : { - "TITLE" : "Event name", - "DESCRIPTION" : "Definition of the event name" - }, - "EVENTINPARAMETERS" : { - "TITLE" : "Mapping to event payload", - "DESCRIPTION" : "Mapping of the process variables to event payload properties" - }, - "EVENTOUTPARAMETERS" : { - "TITLE" : "Mapping from event payload", - "DESCRIPTION" : "Mapping of the event payload properties to process variables" - }, - "EVENTCORRELATIONPARAMETERS" : { - "TITLE" : "Correlation parameters", - "DESCRIPTION" : "Definition of the correlation parameters" - }, - "CHANNELKEY" : { - "TITLE" : "Channel key", - "DESCRIPTION" : "Definition of the channel key" - }, - "CHANNELNAME" : { - "TITLE" : "Channel name", - "DESCRIPTION" : "Definition of the channel name" - }, - "CHANNELTYPE" : { - "TITLE" : "Channel type", - "DESCRIPTION" : "Definition of the channel type" - }, - "CHANNELDESTINATION" : { - "TITLE" : "Channel destination", - "DESCRIPTION" : "Definition of the channel destination" - }, - "KEYDETECTIONFIXEDVALUE" : { - "TITLE" : "Event key fixed value", - "DESCRIPTION" : "Definition of the event key fixed value" - }, - "KEYDETECTIONJSONFIELD" : { - "TITLE" : "Event key json field", - "DESCRIPTION" : "Definition of the event key detection with a json field" - }, - "KEYDETECTIONJSONPOINTER" : { - "TITLE" : "Event key json pointer", - "DESCRIPTION" : "Definition of the event key detection with a json pointer value" - } - }, - "VARIABLELISTENERPACKAGE": { - "VARIABLENAME" : { - "TITLE" : "Variable name", - "DESCRIPTION" : "Defines the variable that will be watched for value changes" - }, - "VARIABLECHANGETYPE" : { - "TITLE" : "Variable change type", - "DESCRIPTION" : "Configures for which change type the variable listener will be triggered" - } - }, - "EXTERNALWORKERJOBPACKAGE": { - "TOPIC": { - "TITLE": "Job topic", - "DESCRIPTION": "The job topic that the external worker will query jobs on" - } - }, - "CASETASKCASEREFERENCEPACKAGE": { - "CASETASKCASEREFERENCE": { - "TITLE": "Case reference", - "DESCRIPTION": "Set the case reference" - } - }, - "PROCESSTASKPROCESSREFERENCEPACKAGE": { - "PROCESSTASKPROCESSREFERENCE": { - "TITLE": "Process reference", - "DESCRIPTION": "Set the process reference" - } - }, - "FALLBACKTODEFAULTTENANTPACKAGE": { - "FALLBACKTODEFAULTTENANT": { - "TITLE": "Fallback to default tenant", - "DESCRIPTION": "Use default tenant as a fallback when definition is not found by key in the specified tenant" - } - }, - "PROCESSTASKINPARAMETERSPACKAGE": { - "PROCESSTASKINPARAMETERS": { - "TITLE": "In parameters", - "DESCRIPTION": "Definition of the input parameters" - } - }, - "PROCESSTASKOUTPARAMETERSPACKAGE": { - "PROCESSTASKOUTPARAMETERS": { - "TITLE": "Out parameters", - "DESCRIPTION": "Definition of the output parameters" - } - }, - "CASETASKINPARAMETERSPACKAGE": { - "CASETASKINPARAMETERS": { - "TITLE": "In parameters", - "DESCRIPTION": "Definition of the input parameters" - } - }, - "CASETASKOUTPARAMETERSPACKAGE": { - "CASETASKOUTPARAMETERS": { - "TITLE": "Out parameters", - "DESCRIPTION": "Definition of the output parameters" - } - }, - "IDVARIABLENAMEPACKAGE": { - "IDVARIABLENAME": { - "TITLE": "ID variable", - "DESCRIPTION": "If set, the instance id of the started instance will be stored in this variable" - } - }, - "TIMEREXPRESSIONPACKAGE": { - "TIMEREXPRESSION": { - "TITLE": "Timer Expression", - "DESCRIPTION": "An ISO-8601 string or an expression that resolves to either an ISO-8601 string or a java.util.Date" - } - }, - "TIMERSTARTTRIGGERPACKAGE": { - "TIMERSTARTTRIGGERSOURCEREF": { - "TITLE": "Start trigger plan item", - "DESCRIPTION": "A reference to the plan item for which the configured standard event needs to happen to start the timer (optional)" - }, - "TRANSITIONEVENT": { - "TITLE": "Start trigger transition event", - "DESCRIPTION": "The type of the transition event. Only used when the start trigger plan item is set" - } - }, - "DECISIONTASKDECISIONREFERENCEPACKAGE": { - "DECISIONTASKDECISIONREFERENCE": { - "TITLE": "Decision reference", - "DESCRIPTION": "Set the decision reference" - } - }, - "IFPARTCONDITIONPACKAGE": { - "IFPARTCONDITION": { - "TITLE": "Condition", - "DESCRIPTION": "" - } - }, - "TRIGGERMODEPACKAGE": { - "TRIGGERMODE": { - "TITLE": "Trigger mode", - "DESCRIPTION": "Determines if the sentry conditions are evaluated with memory (default) of without (on-event). The default means that the parts (on- and ifparts) of a sentry being satisfied will be stored. Subsequent evaluations will use the stored parts when the sentry is re-evaluated. Using 'on-event', all parts are evaluated and if all are true the sentry is satisfied. If not, all results are discarded and not stored." - } - }, - "AUTOCOMPLETEPACKAGE": { - "AUTOCOMPLETEENABLED": { - "TITLE": "Auto complete", - "DESCRIPTION": "Flag indicating that the stage will automatically complete, once all required children are in an end state and no other children are active." - }, - "AUTOCOMPLETECONDITION": { - "TITLE": "Auto complete condition", - "DESCRIPTION": "An expression that is resolved to if the stage can automatically complete." - } - }, - "REQUIREDRULEPACKAGE": { - "REQUIREDENABLED": { - "TITLE": "Required", - "DESCRIPTION": "Flag indicating if the stage, task or milestone is required when determining the parent stage completion. By default false." - }, - "REQUIREDRULECONDITION": { - "TITLE": "Required Rule", - "DESCRIPTION": "An expression that is resolved to determine if the stage, task or milestone is required when determining the parent stage completion." - } - }, - "REPETITIONRULEPACKAGE": { - "REPETITIONENABLED": { - "TITLE": "Repetition", - "DESCRIPTION": "Flag indicating if repetition is enabled" - }, - "REPETITIONRULECONDITION": { - "TITLE": "Repetition Rule", - "DESCRIPTION": "An expression that is resolved to determine if new instances of the planitem need to be created" - }, - "REPETITIONCOUNTERVARIABLENAME": { - "TITLE": "Repetition counter variable", - "DESCRIPTION": "The name of the local variable which stores the instance counter of the repetition. Default value is 'repetitionCounter'." - }, - "VARIABLE_AGGREGATIONS" : { - "TITLE" : "Repetition Variable aggregations", - "DESCRIPTION" : "Variable aggregation definition for when the repetitions complete." - } - }, - "MANUALACTIVATIONRULEPACKAGE": { - "MANUALACTIVATIONENABLED": { - "TITLE": "Manual activation", - "DESCRIPTION": "Flag indicating if the task or stage needs to be manually activated. False by default." - }, - "MANUALACTIVATIONRULECONDITION": { - "TITLE": "Manual activation Rule", - "DESCRIPTION": "An expression that is resolved to determine if the stage or task needs to be manually activated." - } - }, - "COMPLETIONNEUTRALRULEPACKAGE": { - "COMPLETIONNEUTRALENABLED": { - "TITLE": "Completion neutral", - "DESCRIPTION": "Flag indicating if the plan item is completion neutral. False by default." - }, - "COMPLETIONNEUTRALRULECONDITION": { - "TITLE": "Completion neutral Rule", - "DESCRIPTION": "An expression that is resolved to determine if the plan item is completion neutral." - } - }, - "PLANITEMLIFECYCLELISTENERSPACKAGE": { - "PLANITEMLIFECYCLELISTENERS": { - "TITLE": "Lifecycle listeners", - "DESCRIPTION": "Listeners for lifecycle events of a plan item" - } - }, - "DISPLAYORDERPACKAGE": { - "DISPLAYORDER": { - "TITLE": "Display order", - "DESCRIPTION": "A number value indicating the order compared to other stages when getting or showing a stage overview." - } - }, - "INCLUDEINSTAGEOVERVIEWPACKAGE": { - "INCLUDEINSTAGEOVERVIEW": { - "TITLE": "Include in overview", - "DESCRIPTION": "Indicates if this stage should be considered for the stage overview" - } - }, - "MILESTONEVARIABLEPACKAGE" : { - "MILESTONEVARIABLE": { - "TITLE": "Milestone variable", - "DESCRIPTION": "If set, a variable with this name and boolean value true will be created when this milestone is reached" - } - }, - "SCRIPTFORMATPACKAGE": { - "SCRIPTFORMAT": { - "TITLE": "Script format", - "DESCRIPTION": "Script format of the script task (JavaScript, groovy, etc)." - } - }, - "SCRIPTTEXTPACKAGE": { - "SCRIPTTEXT": { - "TITLE": "Script", - "DESCRIPTION": "Script text of the script task." - } - }, - "TRANSITIONEVENTPACKAGE": { - "TRANSITIONEVENT": { - "TITLE": "Transition event type", - "DESCRIPTION": "The type of the transition event" - } - }, - "AVAILABLECONDITIONPACKAGE": { - "AVAILABLECONDITION": { - "TITLE": "Available condition", - "DESCRIPTION": "An optional condition expression on an event listener to indicate to determine when it becomes available." - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "Store result variable transiently", - "DESCRIPTION" : "Flag that marks that the result of the expression will not be persisted at the end of the database transaction." - } - } - }, - "STENCILS" : { - "GROUPS" : { - "DIAGRAM" : "Diagram", - "CONTAINERS" : "Containers", - "ACTIVITIES" : "Activities", - "EVENTLISTENERS" : "Event Listeners", - "SENTRIES" : "Sentries", - "CONNECTORS" : "Connectors" - }, - "CMMNDIAGRAM" : { - "TITLE" : "CMMN-Diagram", - "DESCRIPTION" : "A CMMN 2.0 diagram." - }, - "CASEPLANMODEL" : { - "TITLE" : "Case plan model", - "DESCRIPTION" : "A case plan model" - }, - "STAGE" : { - "TITLE" : "Stage", - "DESCRIPTION" : "A stage" - }, - "TASK" : { - "TITLE" : "Task", - "DESCRIPTION" : "A manual task" - }, - "HUMANTASK" : { - "TITLE" : "Human task", - "DESCRIPTION" : "A manual task assigned to a specific person" - }, - "SERVICETASK" : { - "TITLE" : "Service task", - "DESCRIPTION" : "An automatic task with service logic" - }, - "DECISIONTASK" : { - "TITLE" : "Decision task", - "DESCRIPTION" : "Task to invoke a DMN decision" - }, - "HTTPTASK" : { - "TITLE" : "Http task", - "DESCRIPTION" : "A HTTP task" - }, - "MAILTASK" : { - "TITLE" : "Mail task", - "DESCRIPTION" : "A mail task" - }, - "SCRIPTTASK" : { - "TITLE" : "Script task", - "DESCRIPTION" : "An automatic task with script logic" - }, - "SENDEVENTTASK" : { - "TITLE" : "Send event task", - "DESCRIPTION" : "A send event task" - }, - "EXTERNALWORKERTASK" : { - "TITLE" : "External Worker task", - "DESCRIPTION" : "An task that creates a job which can be executed by an external worker" - }, - "MILESTONE" : { - "TITLE" : "Milestone", - "DESCRIPTION" : "A milestone" - }, - "CASETASK" : { - "TITLE" : "Case task", - "DESCRIPTION" : "A reference to a case definition to start a new instance" - }, - "PROCESSTASK" : { - "TITLE" : "Process task", - "DESCRIPTION" : "A reference to a process definition to start a new instance" - }, - "EVENTLISTENER" : { - "TITLE" : "Event listener", - "DESCRIPTION" : "A generic eventlistener" - }, - "TIMEREVENTLISTENER" : { - "TITLE" : "Timer event listener", - "DESCRIPTION" : "An eventlistener with a timer trigger" - }, - "USEREVENTLISTENER" : { - "TITLE" : "User event listener", - "DESCRIPTION" : "A listener for user events" - }, - "VARIABLEEVENTLISTENER" : { - "TITLE" : "Variable event listener", - "DESCRIPTION" : "A listener for variable events" - }, - "ENTRYCRITERION" : { - "TITLE" : "Entry criterion", - "DESCRIPTION" : "A sentry that defines an entry criterion" - }, - "EXITCRITERION" : { - "TITLE" : "Exit criterion", - "DESCRIPTION" : "A sentry that defines an exit criterion" - }, - "ASSOCIATION" : { - "TITLE" : "Association", - "DESCRIPTION" : "Associates a sentry with a plan item." - } - } - }, - - "EDITOR": { - "POPUP": { - "UNSAVED-CHANGES": { - "TITLE": "You have unsaved changes", - "DESCRIPTION": "What do you want to do with your unsaved changes?", - "ACTION": { - "SAVE": "Save changes", - "DISCARD": "Discard changes", - "CONTINUE": "Continue editing" - } - } - } - }, - - "PROCESS-LIST" : { - "TITLE" : "Business Process Models", - "SEARCH-PLACEHOLDER": "Search", - "ACTION" : { - "CREATE": "Create Process", - "IMPORT": "Import Process" - }, - - "FILTER" : { - "PROCESSES": "Process models", - "PROCESSES-COUNT": "There are {{total}} process models", - "PROCESSES-ONE": "There is one process model", - "PROCESSES-EMPTY": "There is no process model created yet. You can design process models, user forms and then bundle them up into a process app. The first step is to create a process model:", - "PROCESSES-BPMN-HINT": "Create a BPMN model using the BPMN Visual Editor.", - "PROCESSES-BPMN-IMPORT-HINT": "You can also import existing BPMN models.", - "FILTER-TEXT": ", matching \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "There are no process models matching \"{{filterText}}\"", - "RECENT": "Recent", - "RECENT-COUNT": "{{total}} recently used models", - "RECENT-ONE": "One recently used models", - "RECENT-EMPTY": "No recently used models" - }, - - "SORT": { - "MODIFIED-ASC": "Oldest", - "MODIFIED-DESC": "Last modified", - "NAME-ASC": "Name, A-Z", - "NAME-DESC": "Name, Z-A" - } - }, - - "CASE-LIST" : { - "TITLE" : "Case Models", - "SEARCH-PLACEHOLDER": "Search", - "ACTION" : { - "CREATE": "Create Case", - "IMPORT": "Import Case" - }, - - "FILTER" : { - "CASES": "Case models", - "CASES-COUNT": "There are {{total}} case models", - "CASES-ONE": "There is one case model", - "CASES-EMPTY": "There is no case model created yet. You can design case models, user forms and then bundle them up into an app definition. The first step is to create a case model:", - "CASES-CMMN-HINT": "Create a CMMN model using the CMMN Visual Editor.", - "CASES-CMMN-IMPORT-HINT": "You can also import existing CMMN models.", - "FILTER-TEXT": ", matching \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "There are no case models matching \"{{filterText}}\"", - "RECENT": "Recent", - "RECENT-COUNT": "{{total}} recently used models", - "RECENT-ONE": "One recently used models", - "RECENT-EMPTY": "No recently used models" - }, - - "SORT": { - "MODIFIED-ASC": "Oldest", - "MODIFIED-DESC": "Last modified", - "NAME-ASC": "Name, A-Z", - "NAME-DESC": "Name, Z-A" - } - }, - - "FORMS-LIST" : { - "TITLE" : "Forms", - "SEARCH-PLACEHOLDER": "Search", - "ACTION" : { - "CREATE": "Create Form", - "CREATE-INLINE": "Create a new form now!", - "SHOW-MORE": "Show more..." - }, - - "FILTER" : { - "FORMS": "Forms", - "FORMS-COUNT": "There are {{total}} forms", - "FORMS-ONE": "There is one form", - "FORMS-EMPTY": "There are no forms. To add one, click Create Form.", - "FILTER-TEXT": ", matching \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "There is no form matching \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "Oldest", - "MODIFIED-DESC": "Last modified", - "NAME-ASC": "Name, A-Z", - "NAME-DESC": "Name, Z-A" - } - }, - - "DECISIONS-LIST": { - "TITLE": "Decisions", - "SEARCH-PLACEHOLDER": "Search", - "ACTION": { - "CREATE-DECISION-SERVICE": "Create Decision Service", - "CREATE": "Create Decision Table", - "IMPORT-DECISION-TABLE": "Import Decision Table", - "IMPORT-DECISION-SERVICE": "Import Decision Service", - "CREATE-DECISION-TABLES-INLINE": "Create a new decision table now!", - "CREATE-DECISION-SERVICES-INLINE": "Create a new decision service now!", - "SHOW-MORE": "Show more..." - }, - - "FILTER": { - "DECISION-TABLES": "Decision tables", - "DECISION-TABLES-COUNT": "There are {{total}} decision tables", - "DECISION-TABLES-ONE": "There is one decision table", - "DECISION-TABLES-EMPTY": "There are no decision tables. To add one, click Create Decision Table.", - "FILTER-TEXT": ", matching \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "There are no decision table matching \"{{filterText}}\"", - "DECISION-SERVICES": "Decision services", - "DECISION-SERVICES-COUNT": "There are {{total}} decision services", - "DECISION-SERVICES-ONE": "There is one decision service", - "DECISION-SERVICES-EMPTY": "There are no decision services. To add one, click Create Decision Service." - }, - - "SORT": { - "MODIFIED-ASC": "Oldest", - "MODIFIED-DESC": "Last modified", - "NAME-ASC": "Name, A-Z", - "NAME-DESC": "Name, Z-A" - } - }, - - "APPS-LIST" : { - "TITLE" : "App definitions", - "SEARCH-PLACEHOLDER": "Search", - "ACTION" : { - "CREATE": "Create App", - "IMPORT": "Import App", - "SHOW-MORE": "Show more..." - }, - - "FILTER" : { - "APPS": "App definitions", - "APPS-COUNT": "There are {{total}} app definitions", - "APPS-ONE": "There is one app definition", - "APPS-EMPTY": "There are no app definitions. To add one, click Create App Definition.", - "FILTER-TEXT": ", matching \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "There are no app definitions matching \"{{filterText}}\"", - - "NO-APPS": "You can create an App definition by publishing a bundle of Process Models.", - "NO-APPS-CALL-TO-ACTION": "You can create an App definition now.", - "NO-APPS-NOTE": "Remember to Publish it when you are ready to use it." - }, - - "SORT": { - "MODIFIED-ASC": "Oldest", - "MODIFIED-DESC": "Last modified", - "NAME-ASC": "Name, A-Z", - "NAME-DESC": "Name, Z-A" - } - }, - "PROCESS": { - "NAME": "Model name", - "KEY": "Model key", - "DESCRIPTION": "Description", - "VERSION-COMMENT": "Version comment", - "ACTION": { - "DETAILS": "Show details", - "EDIT": "Modify model properties", - "DUPLICATE": "Duplicate this model", - "EXPORT_BPMN20": "Export to BPMN 2.0", - "DELETE": "Delete this model", - "CREATE-CONFIRM": "Create new model", - "DUPLICATE-CONFIRM": "Duplicate the model", - "OPEN-IN-EDITOR": "Visual Editor", - "EDIT-CONFIRM": "Save", - "DELETE-CONFIRM": "Delete process model", - "USE-AS-NEW-VERSION": "Use as new version", - "FAVORITE": "Favorite this model" - - }, - "DETAILS": { - "HISTORY-TITLE": "History", - "LAST-UPDATED-BY": "Last updated by {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}", - "NO-DESCRIPTION": "This model has no description. Modify the model properties to add one" - }, - - "POPUP": { - "CREATE-TITLE": "Create a new business process model", - "DUPLICATE-TITLE": "Duplicate the business process model", - "CREATE-DESCRIPTION": "You need to give a name for the new model and you may want to add a description at the same time.", - "DUPLICATE-DESCRIPTION": "You can change the name for the new model and you may want to change the description at the same time.", - "EDIT-DESCRIPTION": "Change any of the model properties below and then press Save to update the model.", - "DELETE-DESCRIPTION": "Are you sure you want to delete the process model \"{{name}}\"?", - "EDIT-TITLE":"Edit model details", - "DELETE-TITLE": "Delete model", - "DELETE-LOADING-RELATIONS": "Checking model usage...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "This model cannot be deleted, because another model is using it:", - "DELETE-RELATIONS-DESCRIPTION": "This model cannot be deleted, because it is used by other models:", - "DELETE-PROCESS-RELATION": "Process model", - "DELETE-FORM-RELATION": "Form model", - "DELETE-APP-RELATION": "App model", - "IMPORT-DESCRIPTION": "Please browse for or drop a BPMN XML definition with an .bpmn or .bpmn20.xml extension", - "IMPORT-TITLE": "Import a process model", - "USE-AS-NEW-TITLE": "Use as new version", - "USE-AS-NEW-DESCRIPTION": "Are you sure you want to use version {{version}} to create a new version of \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Could not fully restore the app model to the chosen version: some referenced models are missing due to being deleted in the past. Please update the app model accordingly. Missing models:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Model '{{name}}' with internal id {{id}}, created by {{createdBy}}", - "SHARED-WITH": "Shared with", - "PERMISSION": "Permission", - "ACTIONS": "Actions", - "IMPORT": { - "DROPZONE": "Drop a .bpmn or .bpmn20.xml BPMN XML file", - "CANCEL-UPLOAD": "Cancel the upload", - "ERROR": "Error while processing the BPMN XML file", - "NO-DROP": "Drag and drop not supported" - } - }, - "ALERT": { - "EDIT-CONFIRM": "Model updated" - }, - "ERROR": { - "NOT-FOUND": "The requested model does not exist" - } - }, - - "SUBPROCESS": { - "NAME": "Sub process name", - "DESCRIPTION": "Description", - "ACTION": { - "CREATE-CONFIRM": "Create new sub process" - }, - "POPUP": { - "CREATE-TITLE": "Create a new sub process", - "CREATE-DESCRIPTION": "You need to give a name for the new sub process and you may want to add a description at the same time." - } - }, - - "CASE": { - "NAME": "Model name", - "KEY": "Model key", - "DESCRIPTION": "Description", - "VERSION-COMMENT": "Version comment", - "ACTION": { - "DETAILS": "Show details", - "EDIT": "Modify model properties", - "DUPLICATE": "Duplicate this model", - "EXPORT_CMMN": "Export to CMMN 1.1", - "DELETE": "Delete this model", - "CREATE-CONFIRM": "Create new model", - "DUPLICATE-CONFIRM": "Duplicate the model", - "OPEN-IN-EDITOR": "Visual Editor", - "EDIT-CONFIRM": "Save", - "DELETE-CONFIRM": "Delete case model", - "USE-AS-NEW-VERSION": "Use as new version", - "FAVORITE": "Favorite this model" - }, - "DETAILS": { - "HISTORY-TITLE": "History", - "LAST-UPDATED-BY": "Last updated by {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}", - "NO-DESCRIPTION": "This model has no description. Modify the model properties to add one" - }, - - "POPUP": { - "CREATE-TITLE": "Create a new case model", - "DUPLICATE-TITLE": "Duplicate the case model", - "CREATE-DESCRIPTION": "You need to give a name for the new model and you may want to add a description at the same time.", - "DUPLICATE-DESCRIPTION": "You can change the name for the new model and you may want to change the description at the same time.", - "EDIT-DESCRIPTION": "Change any of the model properties below and then press Save to update the model.", - "DELETE-DESCRIPTION": "Are you sure you want to delete the process model \"{{name}}\"?", - "EDIT-TITLE":"Edit model details", - "DELETE-TITLE": "Delete model", - "DELETE-LOADING-RELATIONS": "Checking model usage...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "This model cannot be deleted, because another model is using it:", - "DELETE-RELATIONS-DESCRIPTION": "This model cannot be deleted, because it is used by other models:", - "DELETE-PROCESS-RELATION": "Case model", - "DELETE-FORM-RELATION": "Form model", - "DELETE-APP-RELATION": "App model", - "IMPORT-DESCRIPTION": "Please browse for or drop a CMMN XML definition with an .cmmn or .cmmn.xml extension", - "IMPORT-TITLE": "Import a case model", - "USE-AS-NEW-TITLE": "Use as new version", - "USE-AS-NEW-DESCRIPTION": "Are you sure you want to use version {{version}} to create a new version of \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Could not fully restore the app model to the chosen version: some referenced models are missing due to being deleted in the past. Please update the app model accordingly. Missing models:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Model '{{name}}' with internal id {{id}}, created by {{createdBy}}", - "SHARED-WITH": "Shared with", - "PERMISSION": "Permission", - "ACTIONS": "Actions", - "IMPORT": { - "DROPZONE": "Drop a .cmmn or .cmmn.xml CMMN XML file", - "CANCEL-UPLOAD": "Cancel the upload", - "ERROR": "Error while processing the CMMN XML file", - "NO-DROP": "Drag and drop not supported" - } - }, - "ALERT": { - "EDIT-CONFIRM": "Model updated" - }, - "ERROR": { - "NOT-FOUND": "The requested model does not exist" - } - }, - - "FORM": { - "NAME": "Form name", - "KEY": "Form key", - "DESCRIPTION": "Description", - "ACTION": { - "DETAILS": "Show details", - "EDIT": "Modify model properties", - "DELETE": "Delete this form", - "CREATE-CONFIRM": "Create new form", - "DUPLICATE": "Duplicate this form", - "DUPLICATE-CONFIRM": "Duplicate the form", - "OPEN-IN-EDITOR": "Form Editor", - "EDIT-CONFIRM": "Save", - "DELETE-CONFIRM": "Delete form", - "USE-AS-NEW-VERSION": "Use as new version" - - }, - "DETAILS": { - "HISTORY-TITLE": "History", - "LAST-UPDATED-BY": "Last updated by {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}" - }, - - "POPUP": { - "CREATE-TITLE": "Create a new form", - "DUPLICATE-TITLE": "Duplicate form", - "CREATE-DESCRIPTION": "You need to give a name for the new form and you may want to add a description at the same time.", - "DUPLICATE-DESCRIPTION": "You need to give a name for the new form and you may want to add a description at the same time.", - "SAVE-FORM-TITLE": "Save form", - "EDIT-DESCRIPTION": "Change any of the form properties below and then press Save to update the form.", - "DELETE-DESCRIPTION": "Are you sure you want to delete the form \"{{name}}\"?", - "EDIT-TITLE":"Edit form details", - "DELETE-TITLE": "Delete form", - "USE-AS-NEW-TITLE": "Use as new version", - "USE-AS-NEW-VERSION": "Use as new version", - "USE-AS-NEW-DESCRIPTION": "Are you sure you want to use version {{version}} to create a new version of \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Could not fully restore the app model to the chosen version: some referenced models are missing due to being deleted in the past. Please update the app model accordingly. Missing models:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Model '{{name}}' with internal id {{id}}, created by {{createdBy}}" - } - }, - "DECISION-SERVICE": { - "NAME": "Decision service name", - "KEY": "Decision service key", - "DESCRIPTION": "Description", - "ACTION": { - "DETAILS": "Show details", - "EDIT": "Modify model properties", - "SHARE": "Share this decision service", - "DELETE": "Delete this decision service", - "ADD-COMMENT": "+ Add comment", - "CREATE-CONFIRM": "Create new decision service", - "OPEN-IN-EDITOR": "Decision Service Editor", - "EXPORT": "Export decision service", - "DELETE-CONFIRM": "Delete decision service", - "USE-AS-NEW-VERSION": "Use as new version", - "FAVORITE": "Favorite this decision service", - "DUPLICATE": "Duplicate this decision service", - "DUPLICATE-CONFIRM": "Duplicate the decision service" - }, - "DETAILS": { - "HISTORY-TITLE": "History", - "COMMENTS-TITLE": "Comments", - "LAST-UPDATED-BY": "Last updated by {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}" - }, - "POPUP": { - "CREATE-TITLE": "Create a new decision service", - "CREATE-DESCRIPTION": "You need to give a name for the new decision service and you may want to add a description at the same time.", - "DUPLICATE-TITLE": "Duplicate decision service", - "DUPLICATE-DESCRIPTION": "You need to give a name for the new decision service and you may want to add a description at the same time.", - "DELETE-TITLE": "Delete decision service", - "DELETE-DESCRIPTION": "Are you sure you want to delete the decision service \"{{name}}\"?", - "IMPORT-DESCRIPTION": "Please browse for or drop a DMN XML definition with an .dmn or .dmn.xml extension", - "IMPORT-TITLE": "Import a DMN decision service model", - "IMPORT": { - "DROPZONE": "Drop a .dmn or .dmn.xml DMN XML file", - "CANCEL-UPLOAD": "Cancel the upload", - "ERROR": "Error while processing the DMN XML file", - "NO-DROP": "Drag and drop not supported" - } - } - }, - "DECISION-TABLE": { - "NAME": "Decision Table name", - "KEY": "Decision Table key", - "DESCRIPTION": "Description", - "VERSION-COMMENT": "Version comment", - "HIT-POLICY": "Hit Policy:", - "ACTION": { - "DETAILS": "Show details", - "EDIT": "Modify model properties", - "SHARE": "Share this decision table", - "DELETE": "Delete this decision table", - "ADD-COMMENT": "+ Add comment", - "CREATE-CONFIRM": "Create new decision table", - "OPEN-IN-EDITOR": "Decision Table Editor", - "EXPORT": "Export decision table", - "DELETE-CONFIRM": "Delete decision table", - "USE-AS-NEW-VERSION": "Use as new version", - "FAVORITE": "Favorite this decision table", - "DUPLICATE": "Duplicate this decision table" - }, - "DETAILS": { - "HISTORY-TITLE": "History", - "COMMENTS-TITLE": "Comments", - "LAST-UPDATED-BY": "Last updated by {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}" - }, - "HIT-POLICIES": { - "FIRST": "First", - "ANY": "Any", - "UNIQUE": "Unique", - "PRIORITY": "Priority", - "RULE ORDER": "Rule Order", - "OUTPUT ORDER": "Output Order", - "COLLECT": "Collect" - }, - "COLLECT-OPERATORS": { - "SUM": "Sum", - "MIN": "Min", - "MAX": "Max", - "COUNT": "Count" - }, - "POPUP": { - "CREATE-TITLE": "Create a new decision table", - "CREATE-DESCRIPTION": "You need to give a name for the new decision table and you may want to add a description at the same time.", - "SAVE-DESCRIPTION": "You need to give a name and a unique key for the new decision table and you may want to add a description at the same time.", - "DUPLICATE-TITLE": "Duplicate decision table", - "DUPLICATE-DESCRIPTION": "You need to give a name for the new decision table and you may want to add a description at the same time.", - "DELETE-TITLE": "Delete decision table", - "DELETE-DESCRIPTION": "Are you sure you want to delete the decision table \"{{name}}\"?", - "SAVE-DECISION-TABLE-TITLE": "Save decision table", - "IMPORT-DESCRIPTION": "Please browse for or drop a DMN XML definition with an .dmn or .dmn.xml extension", - "IMPORT-TITLE": "Import a DMN decision table model", - "IMPORT": { - "DROPZONE": "Drop a .dmn or .dmn.xml DMN XML file", - "CANCEL-UPLOAD": "Cancel the upload", - "ERROR": "Error while processing the DMN XML file", - "NO-DROP": "Drag and drop not supported" - }, - "USE-AS-NEW-TITLE": "Use as new version", - "USE-AS-NEW-VERSION": "Use as new version", - "USE-AS-NEW-DESCRIPTION": "Are you sure you want to use version {{version}} to create a new version of \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Could not fully restore the app model to the chosen version: some referenced models are missing due to being deleted in the past. Please update the app model accordingly. Missing models:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Model '{{name}}' with internal id {{id}}, created by {{createdBy}}", - "FORCE-DMN-11": "Force DMN 1.1" - }, - "ALERT": { - "FAVORITE-CONFIRM": "This decision table is now favorited", - "UN-FAVORITE-CONFIRM": "This decision table is no longer favorited" - } - }, - - "APP": { - "NAME": "App definition name", - "KEY": "App definition key", - "DESCRIPTION": "Description", - "ICON": "Icon", - "THEME": "Theme", - "GROUPS-ACCESS": "Groups access, separated by commas", - "USERS-ACCESS": "Users access, separated by commas", - "ACTION": { - "DETAILS": "Show details", - "EDIT": "Modify app definition properties", - "DUPLICATE": "Duplicate this application", - "SHARE": "Share this app definition", - "DELETE": "Delete this app definition", - "CREATE-CONFIRM": "Create new app definition", - "DUPLICATE-CONFIRM": "Duplicate the app definition", - "DELETE-CONFIRM": "Delete app definition", - "USE-AS-NEW-VERSION": "Use as new version", - "OPEN-IN-EDITOR": "App Editor", - "PUBLISH": "Publish", - "PUBLISH-CONFIRM": "Publish app definition", - "SELECT-ICON": "Change icon...", - "SELECT-THEME": "Change theme...", - "EDIT-MODELS": "Edit included models", - "EXPORT-ZIP": "Export app definition as a zip file", - "EXPORT-BAR": "Export app definition as a deployable bar file" - - }, - "DETAILS": { - "TITLE": "App definition details: {{name}}", - "HISTORY-TITLE": "History", - "MODELS-TITLE": "Models included in the app definition", - "LAST-UPDATED-BY": "Last updated by {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}", - "NO-DESCRIPTION": "This app definition has no description. Modify the app definition properties to add one", - "NO-MODELS-SELECTED": "No models are selected for this app" - }, - "TITLE": { - "SELECT-ICON": "Select app icon", - "SELECT-THEME": "Select app colors", - "PREVIEW": "Preview" - - }, - "POPUP": { - "CREATE-TITLE": "Create a new app definition", - "DUPLICATE-TITLE": "Duplicate an app definition", - "SAVE-APP-TITLE": "Save app definition", - "SAVE-APP-SAVE-SUCCESS": "Saved app definition", - "CREATE-DESCRIPTION": "You need to give a name for the new app definition and you may want to add a description at the same time.", - "DUPLICATE-DESCRIPTION": "You can give a name for the new app definition and you may want to change the description at the same time.", - "PUBLISH-TITLE": "Publish app definition", - "PUBLISH-DESCRIPTION": "Are you sure you want to publish the app definition \"{{name}}\"? Note that this app definition will be versioned and the workflow app will be updated if existing already.", - "PUBLISH-FIELD": "Publish? Note that if publish is enabled, this app definition will be versioned and the workflow app will be updated if existing already.", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT": "Your process model \"{{modelInAppName}}\" has the same identifier \"{{processDefinitionKey}}\" as the existing deployed process \"{{conflictingModelName}}\" of the app \"{{conflictingAppName}}\". Please change this \"id\" property of the process model to something different.", - "PUBLISH-ERROR-PROCESS-ALREADY-USED": "Following process models are already used in another app. Is this ok?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP": "App", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS": "Invalid app: duplicate process identifiers found (change the \"id\" property of the offending process models):", - "DELETE-TITLE": "Delete app definition", - "DELETE-DESCRIPTION": "Are you sure you want to delete the app definition \"{{name}}\"?", - "DELETE-DESCRIPTION-WITH-RUNTIME": "Are you sure you want to delete the app definition \"{{name}}\"? Note that this app definition has been deployed to the task landing page and by confirming, the app will be removed from the task app landing page.", - "DELETE-CASCADE-FALSE": "Only delete the current version of this app definition (v{{version}})", - "DELETE-CASCADE-TRUE": "Also delete all previous versions of this app definition", - "HAS-CUSTOM-STENCILITEM" : "Model \"{{modelName}}\" uses a stencil with custom stencil items. It is not possible to use this model in an app definition.", - "HAS-VALIDATIONERROR" : "Model \"{{modelName}}\" has validation errors and cannot be added to an app definition. Open the model in the editor to see more details about the validation error(s).", - "IMPORT-DESCRIPTION":"Please browse for or drop a app definition with a .zip extension", - "IMPORT-TITLE":"Import an app definition model", - "IMPORT": { - "DROPZONE": "Drop a .zip app definition file", - "CANCEL-UPLOAD": "Cancel the upload", - "RENEWIDM-IDS": "Renew the user and group identifiers when importing step and BPMN models. This is often required when importing the app definition into a different Flowable environment. It will try to link the human steps and user tasks to the right user and group in this target environment.", - "ERROR": "Error while processing the app definition file", - "NO-DROP": "Drag and drop not supported" - }, - "INCLUDE-MODELS-TITLE": "Models included in the app definition" - }, - "ALERT": { - "DELETE-CONFIRM": "App definition deleted", - "PUBLISH-CONFIRM": "The app definition has been published", - "PUBLISH-ERROR": "Could not publish app definition. Please check the validity of the referenced process models" - } - }, - - "SHARE-INFO": { - "ACTION": { - "ADD": "Add another person" - } - }, - - "FORM-BUILDER": { - "PALLETTE": { - "TEXT": "Text", - "MULTILINE-TEXT": "Multiline text", - "PASSWORD": "Password", - "NUMBER": "Number", - "CHECKBOX": "Checkbox", - "DATE": "Date", - "DROPDOWN": "Dropdown", - "RADIO": "Radio buttons", - "PEOPLE": "People", - "GROUP-OF-PEOPLE": "Group of people", - "UPLOAD": "Upload", - "EXPRESSION": "Expression", - "DECIMAL": "Decimal", - "HYPERLINK": "Hyperlink", - "SPACER": "Spacer", - "HORIZONTAL-LINE": "Horizontal line", - "HEADLINE": "Headline", - "HEADLINE-WITH-LINE":"Headline" - }, - "TABS": { - "GENERAL": "General", - "OPTIONS": "Options", - "UPLOAD-OPTIONS": "Upload options", - "ADVANCED-OPTIONS":"Advanced" - }, - "VERSION": "Version {{version}}", - "LAST-UPDATED": "Last updated by {{lastUpdatedBy}}, {{lastUpdated | dateformat}}", - "TITLE": { - "DESIGN": "Design", - "OUTCOME": "Outcomes" - }, - "POPUP": { - "EDIT-TITLE": "Edit field '{{name}}'", - "EXPRESSION-TITLE": "Edit expression" - }, - "MESSAGE": { - "EMPTY-EXPRESSION": "(No expression value)", - "EXPRESSION-HELP": "You can also display values previously submitted in any form, as part of the text, by referencing them using a notation as follows ${myFieldId}.", - "OPTIONS-EXPRESSION-HELP": "You can use an expression to dynamically populate options for example by referencing a variable like this ${optionsVariable}. The expression needs to result in either a java object (java.util.List with Option objects) or its json representation." - }, - "LABEL" : { - "FUNCTIONAL-GROUP": "Select group..", - "PERSON": "Select person.." - }, - "COMPONENT": { - "LABEL": "Label:", - "OVERRIDEID": "Override id?", - "ID": "Id:", - "PLACEHOLDER": "Placeholder:", - "OPTIONS": "Options", - "RADIO-BUTTON-DEFAULT": "Option 1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION": "Please choose one...", - "DROPDOWN-EMPTY-VALUE-HELP": "This is the 'empty value' option. Selecting this at runtime is the taken to mean 'no value' or 'empty'. This is allowed for optional fields, but not allowed for required fields.", - "OPTIONS-EXPRESSION": "Options expression:", - "OPTIONS-EXPRESSION-ENABLED": "Enable options expression", - "REQUIRED": "Required", - "READONLY": "Read-only", - "EXPRESSION": "Expression", - "ADD-OPTION": "+ Add a new option", - "UPLOAD-ALLOW-MULTIPLE": "Allow uploading multiple files", - "SIZE": "Size", - "MAX-LENGTH":"Maximum length:", - "MIN-LENGTH":"Minimum length:", - "PASSWORD-UNMASK-OPTION": "password masking/unmasking option", - "HYPERLINK-URL": "Hyperlink URL", - "REGEX-PATTERN":"Regex standard", - "MASK":{ - "TITLE":"Input mask", - "EXAMPLES":{ - "TITLE":"Examples:", - "NUMBER":"Any number", - "LETTER":"Any letter", - "NUMBERORLETTER":"Any letter or number", - "OPTIONAL":"Make mask optional (not valid)", - "PHONE":"Phone" - } - } - }, - "OUTCOMES": { - "DESCRIPTION": "You can define multiple outcomes for this task. When completing a task, the users selects one of the available outcomes, which can be used in eg. a condition further on in the process.", - "NO-OUTCOMES-OPTION": "Don't use custom outcomes, only show a 'Complete' button.", - "OUTCOMES-OPTION": "Use custom outcomes for this form.", - "POSSIBLE-OUTCOMES": "Possible outcomes", - "NEW-OUTCOME-PLACEHOLDER": "Enter new outcome", - "ADD": "Add outcome", - "REMOVE": "Remove" - } - }, - - "DECISION-TABLE-EDITOR": { - "EMPTY-MESSAGES": { - "NO-VARIABLE-SELECTED": "Undefined" - }, - "POPUP": { - "EXPRESSION-EDITOR": { - "INPUT-TITLE": "Edit input column", - "INPUT-DESCRIPTION": "Select input variable as input for the column", - "OUTPUT-TITLE": "Edit output column", - "OUTPUT-DESCRIPTION": "Select an existing output variable or create a new one", - "EXPRESSION-LABEL": "Column label:", - "EXPRESSION-PLACEHOLDER": "Enter an optional label", - "EXPRESSION-VARIABLE-NAME": "Variable name:", - "EXPRESSION-VARIABLE-TYPE": "Variable type:", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER": "Enter a variable name", - "OUTPUT-NEW-VARIABLE-ID": "Variable ID:", - "OUTPUT-NEW-VARIABLE-TYPE": "Variable type:", - "COMPLEX-EXPRESSION-LABEL": "Complex expression:", - "ALLOWED-VALUES": "Allowed values (optional):", - "OUTPUT-VALUES": "Output values ", - "OUTPUT-VALUES-OPTIONAL": "(optional):", - "OUTPUT-VALUES-NOT-OPTIONAL": "(drag rows for priority / output order):" - } - }, - "BUTTON-ACTIONS-LABEL": "Actions", - "BUTTON-ADD-INPUT-LABEL": "Add input", - "BUTTON-ADD-OUTPUT-LABEL": "Add output", - "BUTTON-ADD-RULE-LABEL": "Add rule", - "BUTTON-MOVE-RULE-UPWARDS-LABEL": "Move up", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL": "Move down", - "BUTTON-REMOVE-RULE-LABEL": "Remove rule", - "ALERT": { - "EXPRESSION-VARIABLE-REQUIRED-ERROR": "All input and output expressions must reference a form field or variable.", - "SAVE-CONFIRM": "Saved decision table '{{name}}'" - } - }, - - "TOUR": { - "WELCOME-TITLE": "Welcome, {{userName}}", - "WELCOME-CONTENT": "This a short tour of the Flowable editor. The next few steps will guide you through the different sections of the application to get you started. Press the ESC key to stop at any time." , - "PALETTE-TITLE": "The Palette", - "PALETTE-CONTENT": "All the available constructs to create a business process can be found here. They are arranged in logical groups. To open a group simply click on it:", - "CANVAS-TITLE": "The Canvas", - "CANVAS-CONTENT": "This is the work space on which you create your business process. Drag elements from the palette on the left and drop them on this canvas to start modeling.", - "DRAGDROP-TITLE": "Drag and Drop Example", - "DRAGDROP-CONTENT": "Here is an example how you get started with modeling:", - "PROPERTIES-TITLE": "Properties", - "PROPERTIES-CONTENT": "Here you can configure the properties of a business process construct. Simply select the item on the canvas and its properties will be shown. Click on the property if you want to edit it", - "TOOLBAR-TITLE": "The Toolbar", - "TOOLBAR-CONTENT": "All the actions can be found here: saving or validating a model, copy and pasting parts of a process, and so on. Hover over the buttons to get a description for an action.", - "END-TITLE": "The End", - "END-CONTENT": "That's it! You can now start modeling your processes. If you have any questions, feel free to ask them on the Flowable Forum " - }, - - "FEATURE-TOUR" : { - "BENDPOINT" : { - "TITLE": "Bend point tutorial", - "DESCRIPTION" : "When you are connecting process steps with each other using sequence flow (those arrows between process steps), you might find that these sequence flow cross each other or you would like to arrange them differently. To do this, you can add or remove a bend point to or from a sequence flow.

As shown below in the picture, you first click the 'add bendpoint' and then click on a sequence flow to add it. Note that the sequence flow will show you a subtle indication in green to show the bendpoint can be added there.

Removing a bendpoint again follows a similar pattern: click the 'remove bendpoint' button and click on the bend point to remove it again." - } - }, - - "ACTION.OK" : "Ok", - "ACTION.SAVE" : "Save", - "ACTION.SAVE-AND-CLOSE" : "Save and close editor", - "ACTION.SEND" : "Send", - "ACTION.CANCEL" : "Cancel", - "ACTION.SELECT" : "Select", - "ACTION.ADD" : "Add", - "ACTION.REMOVE" : "Remove", - "ACTION.MOVE.UP" : "Move entry up", - "ACTION.MOVE.DOWN" : "Move entry down", - - "TOOLBAR.ACTION.CLOSE" : "Close the editor and go back to the overview page", - "TOOLBAR.ACTION.SAVE" : "Save the model", - "TOOLBAR.ACTION.VALIDATE" : "Validate the model", - "TOOLBAR.ACTION.CUT" : "Cut (select one or more elements in your business process)", - "TOOLBAR.ACTION.COPY" : "Copy (select one or more elements in your business process)", - "TOOLBAR.ACTION.PASTE" : "Paste", - "TOOLBAR.ACTION.DELETE" : "Delete the selected element", - "TOOLBAR.ACTION.UNDO" : "Undo", - "TOOLBAR.ACTION.REDO" : "Redo", - "TOOLBAR.ACTION.ZOOMIN" : "Zoom in", - "TOOLBAR.ACTION.ZOOMOUT" : "Zoom out", - "TOOLBAR.ACTION.ZOOMACTUAL" : "Zoom to actual size", - "TOOLBAR.ACTION.ZOOMFIT" : "Zoom to fit", - "TOOLBAR.ACTION.BENDPOINT.ADD" : "Add bend-point to the selected sequence flow", - "TOOLBAR.ACTION.BENDPOINT.REMOVE" : "Remove bend-point from the selected sequence flow", - "TOOLBAR.ACTION.ALIGNHORIZONTAL" : "Align model horizontal", - "TOOLBAR.ACTION.ALIGNVERTICAL" : "Align model vertical", - "TOOLBAR.ACTION.SAMESIZE" : "Same size", - "TOOLBAR.ACTION.HELP": "Start the guided tour", - "TOOLBAR.ACTION.FEEDBACK": "Provide feedback", - - "FORM_TOOLBAR.ACTION.SAVE" : "Save the model", - - "APP_DEFINITION_TOOLBAR.ACTION.SAVE" : "Save the app definition", - - "BUTTON.ACTION.DELETE.TOOLTIP": "Delete the element from the model", - "BUTTON.ACTION.MORPH.TOOLTIP": "Change the element type", - - "ELEMENT.AUTHOR" : "Author", - "ELEMENT.DATE_CREATED" : "Date created", - - "PROPERTY.REMOVED" : "removed", - "PROPERTY.EMPTY" : "No value", - "PROPERTY.PROPERTY.EDIT.TITLE" : "Change value for ", - - "PROPERTY.FEEDBACK.TITLE" : "Please fill-in your feedback", - - "PROPERTY.ASSIGNMENT.TITLE" : "Assignment", - "PROPERTY.ASSIGNMENT.TYPE" : "Type", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE" : "Identity store", - "PROPERTY.ASSIGNMENT.TYPE.STATIC" : "Fixed values", - "PROPERTY.ASSIGNMENT.ASSIGNEE" : "Assignee", - "PROPERTY.ASSIGNMENT.MATCHING" : "Use ↑ and ↓ to select and press Enter to confirm or use the mouse", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER" : "Enter an assignee", - "PROPERTY.ASSIGNMENT.EMPTY" : "No assignment selected", - "PROPERTY.ASSIGNMENT.NONE" : "None ...", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "Search user", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "Search group", - "PROPERTY.ASSIGNMENT.SEARCH": "Search: ", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY" : "Assignee {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY" : "{{length}} Candidate users", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS" : "Candidate users", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY" : "{{length}} Candidate groups", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS" : "Candidate groups", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY": "User {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY": "User {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY": "Field {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY" : "Process initiator", - "PROPERTY.ASSIGNMENT.IDM.TYPE" : "Assignment", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS" : "No candidate users selected...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS" : "No candidate groups selected...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR" : "Assigned to process initiator", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER" : "Assigned to single user", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS" : "Candidate users", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS" : "Candidate groups", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE" : "Allow process initiator to complete task", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY" : "{{length}} execution listeners", - "PROPERTY.EXECUTIONLISTENERS.EMPTY" : "No execution listeners configured", - "PROPERTY.EXECUTIONLISTENERS.EVENT" : "Event", - "PROPERTY.EXECUTIONLISTENERS.CLASS" : "Class", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION" : "Expression", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED" : "No execution listener selected", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME" : "Name", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE" : "String value", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Enter a string value", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING" : "String", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER" : "Enter a string", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION" : "Implementation", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY" : "No Field selected", - - "PROPERTY.FIELDS" : "{{length}} fields", - "PROPERTY.FIELDS.EMPTY" : "No fields selected", - "PROPERTY.FIELDS.NAME" : "Name", - "PROPERTY.FIELDS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.FIELDS.STRINGVALUE" : "String value", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER" : "Enter a string value", - "PROPERTY.FIELDS.STRING" : "String", - "PROPERTY.FIELDS.STRING.PLACEHOLDER" : "Enter a string", - "PROPERTY.FIELDS.IMPLEMENTATION" : "Implementation", - - "PROPERTY.EXCEPTIONS" : "{{length}} exceptions", - "PROPERTY.EXCEPTIONS.EMPTY" : "No exceptions selected", - "PROPERTY.EXCEPTIONS.CODE" : "Code", - "PROPERTY.EXCEPTIONS.CODE.PLACEHOLDER" : "Enter a code", - "PROPERTY.EXCEPTIONS.CLASS" : "Class", - "PROPERTY.EXCEPTIONS.CLASS.PLACEHOLDER" : "Enter an class", - "PROPERTY.EXCEPTIONS.CHILDREN" : "Include child exceptions", - - "PROPERTY.DATAPROPERTIES.VALUES" : "{{length}} data objects", - "PROPERTY.DATAPROPERTIES.EMPTY" : "No data objects configured", - "PROPERTY.DATAPROPERTIES.ID" : "Id", - "PROPERTY.DATAPROPERTIES.ID.PLACEHOLDER" : "Enter an id", - "PROPERTY.DATAPROPERTIES.NAME" : "Name", - "PROPERTY.DATAPROPERTIES.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.DATAPROPERTIES.TYPE" : "Type", - "PROPERTY.DATAPROPERTIES.VALUE.PLACEHOLDER" : "Enter a value (optional)", - "PROPERTY.DATAPROPERTIES.VALUE" : "Default Value", - - "PROPERTY.FORMPROPERTIES.VALUE" : "{{length}} form properties", - "PROPERTY.FORMPROPERTIES.EMPTY" : "No form properties selected", - "PROPERTY.FORMPROPERTIES.ID" : "Id", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER" : "Enter an id", - "PROPERTY.FORMPROPERTIES.NAME" : "Name", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.FORMPROPERTIES.TYPE" : "Type", - "PROPERTY.FORMPROPERTIES.DATEPATTERN" : "Date pattern", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER" : "Enter date pattern", - "PROPERTY.FORMPROPERTIES.VALUES" : "Values", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY" : "No enum value selected", - "PROPERTY.FORMPROPERTIES.VALUES.ID" : "Id", - "PROPERTY.FORMPROPERTIES.VALUES.NAME" : "Name", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER" : "Enter id of a value", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER" : "Enter name of a value", - "PROPERTY.FORMPROPERTIES.EXPRESSION" : "Expression", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.FORMPROPERTIES.VARIABLE" : "Variable", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER" : "Enter a variable", - "PROPERTY.FORMPROPERTIES.DEFAULT" : "default", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER" : "Enter a default", - "PROPERTY.FORMPROPERTIES.REQUIRED" : "Required", - "PROPERTY.FORMPROPERTIES.READABLE" : "Readable", - "PROPERTY.FORMPROPERTIES.WRITABLE" : "Writable", - - "PROPERTY.INPARAMETERS.VALUE" : "{{length}} in-parameters", - "PROPERTY.INPARAMETERS.EMPTY" : "No in-parameters configured", - - "PROPERTY.OUTPARAMETERS.VALUE" : "{{length}} out-parameters", - "PROPERTY.OUTPARAMETERS.EMPTY" : "No out-parameters configured", - - "PROPERTY.PARAMETER.SOURCE" : "Source", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER" : "Enter a source", - "PROPERTY.PARAMETER.SOURCEEXPRESSION" : "Source expression", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER" : "Enter a source expression", - "PROPERTY.PARAMETER.TARGET" : "Target", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER" : "Enter a target", - "PROPERTY.PARAMETER.TARGETEXPRESSION" : "Target expression", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER" : "Enter a target expression", - "PROPERTY.PARAMETER.EMPTY" : "No parameter selected", - - "PROPERTY.PROCESSREFERENCE.EMPTY" : "No reference selected", - "PROPERTY.PROCESSREFERENCE.TITLE" : "Process reference", - "PROPERTY.PROCESSREFERENCE.ERROR.PROCESS" : "There was an error loading the processes. Try again later", - "PROPERTY.PROCESSREFERENCE.PROCESS.LOADING" : "Loading processes...", - "PROPERTY.PROCESSREFERENCE.PROCESS.EMPTY" : "This folder contains no processes", - - "PROPERTY.FORMREFERENCE.EMPTY" : "No reference selected", - "PROPERTY.FORMREFERENCE.TITLE" : "Form reference", - "PROPERTY.FORMREFERENCE.DESCRIPTION" : "Reference to a form", - "PROPERTY.FORMREFERENCE.ERROR.FORM" : "There was an error loading the forms. Try again later", - "PROPERTY.FORMREFERENCE.FORM.LOADING" : "Loading forms...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY" : "This folder contains no forms", - - "PROPERTY.TASKLISTENERS.VALUE" : "{{length}} task listeners", - "PROPERTY.TASKLISTENERS.EMPTY" : "No task listeners configured", - "PROPERTY.TASKLISTENERS.EVENT" : "Event", - "PROPERTY.TASKLISTENERS.CLASS" : "Class", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.TASKLISTENERS.EXPRESSION" : "Expression", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.TASKLISTENERS.UNSELECTED" : "No task listener selected", - "PROPERTY.TASKLISTENERS.FIELDS.NAME" : "Name", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE" : "String value", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Enter a string value", - "PROPERTY.TASKLISTENERS.FIELDS.STRING" : "String", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER" : "Enter a string", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION" : "Implementation", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY" : "No Field selected", - - "PROPERTY.EVENTLISTENERS.DISPLAY" : "{{length}} event listeners", - "PROPERTY.EVENTLISTENERS.EMPTY" : "No event listeners configured", - "PROPERTY.EVENTLISTENERS.EVENTS": "Events", - "PROPERTY.EVENTLISTENERS.RETHROW": "Rethrow event?", - "PROPERTY.EVENTLISTENERS.CLASS" : "Class", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE" : "Entity type", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER" : "Enter an entity type", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE": "Rethrow event type", - "PROPERTY.EVENTLISTENERS.ERRORCODE" : "Error code", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER" : "Enter an error code", - "PROPERTY.EVENTLISTENERS.MESSAGENAME" : "Message name", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER" : "Enter a message name", - "PROPERTY.EVENTLISTENERS.SIGNALNAME" : "Signal name", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER" : "Enter a signal name", - "PROPERTY.EVENTLISTENERS.UNSELECTED" : "No event listener selected", - - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE" : "{{length}} lifecycle listeners", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY" : "No lifecycle listeners configured", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT" : "Event", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE" : "Source state", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE" : "Target state", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS" : "Class", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION" : "Expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED" : "No task listener selected", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME" : "Name", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE" : "String value", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Enter a string value", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING" : "String", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER" : "Enter a string", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION" : "Implementation", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY" : "No Field selected", - - "PROPERTY.SIGNALDEFINITIONS.DISPLAY" : "{{length}} signal definitions", - "PROPERTY.SIGNALDEFINITIONS.EMPTY" : "No signal definitions configured", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL": "Global", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE": "Process Instance", - "PROPERTY.SIGNALDEFINITIONS.ID" : "Id", - "PROPERTY.SIGNALDEFINITIONS.NAME" : "Name", - "PROPERTY.SIGNALDEFINITIONS.SCOPE" : "Scope", - - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY" : "{{length}} message definitions", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY" : "No message definitions configured", - "PROPERTY.MESSAGEDEFINITIONS.ID" : "Id", - "PROPERTY.MESSAGEDEFINITIONS.NAME" : "Name", - - "PROPERTY.ESCALATIONDEFINITIONS.DISPLAY" : "{{length}} escalation definitions", - "PROPERTY.ESCALATIONDEFINITIONS.EMPTY" : "No escalation definitions configured", - "PROPERTY.ESCALATIONDEFINITIONS.ID" : "Id", - "PROPERTY.ESCALATIONDEFINITIONS.NAME" : "Name", - - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY" : "No sequence flow order determined", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY" : "Sequence flow order set", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND" : "No outgoing sequence flow found.", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION" : "Set the order in which the sequence flow need to be evaluated:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE" : "Sequence flow to {{targetType}} {{targetTitle}}", - - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE" : "Sequence flow condition", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC" : "Condition expression", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY": "No condition set", - - "PROPERTY.DUEDATE.EMPTY" : "No due date", - "PROPERTY.DUEDATE.DEFINED" : "Due date defined", - "PROPERTY.DUEDATE.TITLE" : "Due date", - "PROPERTY.DUEDATE.EXPRESSION-LABEL" : "Due date expression", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE" : "No due date", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION" : "Expression definition", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC" : "Fixed duration after task creation", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD" : "Based on field", - - "PROPERTY.EVENTINPARAMETERS.VALUE" : "{{length}} event in parameter items", - "PROPERTY.EVENTINPARAMETERS.EMPTY" : "No in parameter configured", - - "PROPERTY.EVENTINPARAMETERS.EVENTNAME" : "Event property name", - "PROPERTY.EVENTINPARAMETERS.EVENTNAME.PLACEHOLDER" : "Enter an event property name", - "PROPERTY.EVENTINPARAMETERS.EVENTTYPE" : "Type", - "PROPERTY.EVENTINPARAMETERS.VARIABLENAME" : "Variable name", - "PROPERTY.EVENTINPARAMETERS.VARIABLENAME.PLACEHOLDER" : "Enter a variable name", - "PROPERTY.EVENTINPARAMETERS.NOSELECTION" : "No parameter selected", - - "PROPERTY.EVENTOUTPARAMETERS.VALUE" : "{{length}} event out parameter items", - "PROPERTY.EVENTOUTPARAMETERS.EMPTY" : "No out parameter configured", - - "PROPERTY.EVENTOUTPARAMETERS.EVENTNAME" : "Event property name", - "PROPERTY.EVENTOUTPARAMETERS.EVENTNAME.PLACEHOLDER" : "Enter an event property name", - "PROPERTY.EVENTOUTPARAMETERS.EVENTTYPE" : "Type", - "PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME" : "Variable name", - "PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME.PLACEHOLDER" : "Enter a variable name", - "PROPERTY.EVENTOUTPARAMETERS.NOSELECTION" : "No parameter selected", - - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUE" : "{{length}} correlation parameters", - "PROPERTY.EVENTCORRELATIONPARAMETERS.EMPTY" : "No correlation parameters configured", - - "PROPERTY.EVENTCORRELATIONPARAMETERS.NAME" : "Name", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.EVENTCORRELATIONPARAMETERS.TYPE" : "Type", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NOSELECTION" : "No parameter selected", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUEPROP" : "Value", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUEPROP.PLACEHOLDER" : "Enter a value / expression", - - "PROPERTY.VARIABLE.AGGREGATIONS.CLASS" : "Class", - "PROPERTY.VARIABLE.AGGREGATIONS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.VARIABLE.AGGREGATIONS.CREATEOVERVIEW" : "Create target overview variable", - "PROPERTY.VARIABLE.AGGREGATIONS.DEFINITIONS.UNSELECTED" : "No variables selected", - "PROPERTY.VARIABLE.AGGREGATIONS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.VARIABLE.AGGREGATIONS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.VARIABLE.AGGREGATIONS.EMPTY" : "No variable aggregations configured", - "PROPERTY.VARIABLE.AGGREGATIONS.STOREASTRANSIENT" : "Store target variable transiently", - "PROPERTY.VARIABLE.AGGREGATIONS.UNSELECTED" : "No variable aggregations selected", - "PROPERTY.VARIABLE.AGGREGATIONS.VALUE" : "{{length}} variable aggregations", - - "MODEL.SAVE.TITLE" : "Save model", - "MODEL.VALIDATE.TITLE" : "Validation results", - "MODEL.NAME" : "Name", - "MODEL.KEY" : "Key", - "MODEL.DESCRIPTION" : "Description", - "MODEL.SAVE.NEWVERSION" : "Save this as a new version? This means you can always go back to a previous version", - "MODEL.SAVE.COMMENT" : "Comment", - "MODEL.SAVE.SAVING" : "Saving model", - "MODEL.LASTMODIFIEDDATE" : "Last saved", - "MODEL.SAVE.ERROR": "Unexpected error: could not save model", - "MODEL.VALIDATIONERRORS": "Note that the model contains validation errors. This means that the model can not be deployed on the Flowable Engine in its current state.", - "MODEL.CONFLICT.WRITE": "Could not save model: '{{userFullName}}' has made changes to this model", - "MODEL.CONFLICT.WRITE.OPTIONS": "Select an option to resolve this conflict:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE": "Overwrite other model", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES": "Discard my changes", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS": "Save as new model", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION": "Create new version", - "MODEL.CONFLICT.SAVEAS" : "Save as:", - - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP": "An activity is about to be executed as a compensation for another activity. The event targets the activity that is about to be executed for compensation", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP": "An activity has been completed successfully", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP": "An activity has received an error event. Dispatched before the actual error has been received by the activity", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP": "A new membership has been created", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP": "A single membership has been deleted", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP": "All memberships in the related group have been deleted. No individual events will be dispatched due to possible performance reasons", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP": "A task as been assigned. This is thrown alongside with an ENTITY_UPDATED event", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP": "A task has been completed. Dispatched before the task entity is deleted", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP": "When a BPMN Error was thrown, but was not caught within in the process", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP": "A new variable has been created", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP": "An existing variable has been deleted", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP": "An existing variable has been updated", - - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY" : "No reference selected", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE" : "Decision table reference", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM" : "There was an error loading the decision tables. Try again later", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING" : "Loading decision tables...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY" : "This folder contains no decision tables", - - "PROPERTY.DECISIONSERVICEREFERENCE.EMPTY" : "No reference selected", - "PROPERTY.DECISIONSERVICEREFERENCE.TITLE" : "Decision service reference", - "PROPERTY.DECISIONSERVICEREFERENCE.ERROR.FORM" : "There was an error loading the decision services. Try again later", - "PROPERTY.DECISIONSERVICEREFERENCE.DECISIONSERVICE.LOADING" : "Loading decision services...", - "PROPERTY.DECISIONSERVICEREFERENCE.DECISIONSERVICE.EMPTY" : "This folder contains no decision services", - - "PROPERTY.CASEREFERENCE.EMPTY" : "No reference selected", - "PROPERTY.CASEREFERENCE.TITLE" : "Case model reference", - "PROPERTY.CASEREFERENCE.ERROR.FORM" : "There was an error loading the case models. Try again later", - "PROPERTY.CASEREFERENCE.CASE.LOADING" : "Loading case models...", - "PROPERTY.CASEREFERENCE.CASE.EMPTY" : "This folder contains no case models" -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/es.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/es.json deleted file mode 100644 index 4f60a55a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/es.json +++ /dev/null @@ -1,2889 +0,0 @@ -{ - "GENERAL" : { - "MAIN-TITLE": "Editor de Flowable", - "NAVIGATION" : { - "PROCESSES": "Procesos", - "CASEMODELS": "Casos", - "FORMS": "Formularios", - "DECISION-TABLES": "Tablas de decisión", - "APPS": "Aplicaciones" - }, - "TITLE": { - "SELECT-GROUP" :"Selecciona el grupo", - "MATCHING-GROUPS": "Grupos coincidentes", - "FILTER": "Filtro", - "HISTORY": "Historial" - }, - "ACTION": { - "LOGOUT": "Salir", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST": "Mostrar todas las definiciones", - "CANCEL": "Cancelar", - "CLOSE": "Cerrar", - "EDIT": "Editar", - "SAVE": "Guardar", - "OPEN": "Abrir", - "OK": "Ok", - "CONFIRM": "Confirmar", - "CONFIRM-AND-CLOSE": "Confirmar y cerrar", - "NEW-FORM": "Nuevo formulario", - "CREATE-FORM": "Crear formulario", - "NEW-DECISION-TABLE": "Nueva tabla de decisión", - "CREATE-DECISION-TABLE": "Crear tabla de decisión" - }, - "MESSAGE": { - "SELECT-GROUP-HELP": "Usa ↑ y ↓ para seleccionar y presiona Enter para confirmar", - "PEOPLE-NO-MATCHING-RESULTS": "No se encontraron usuarios similares", - "GROUP-NO-MATCHING-RESULTS": "No se encontraron grupos similares", - "GROUP-SOURCE-TYPE": "Origen de grupo", - "GROUP-SOURCE-SEARCH-OPTION": "Búsqueda de grupo", - "GROUP-SOURCE-FIELD-OPTION": "Campo de formulario" - }, - "OTHERS" : { - "PROCESS" : "Proceso", - "PROCESS_NAVIGATOR" : "Navegador de procesos", - "NO_STRUCTURAL_ELEMENTS_USED" : "No se usaron elementos estructurales." - } - }, - - "BPMN" : { - "TITLE": "Editor de procesos", - "DESCRIPTION" : "Editor de procesos BPMN", - "PROPERTYPACKAGES" : { - "PROCESS_IDPACKAGE" : { - "PROCESS_ID" : { - "TITLE" : "Identificador de proceso", - "DESCRIPTION" : "Indentificador único de la definición del proceso." - } - }, - "OVERRIDEIDPACKAGE" : { - "OVERRIDEID" : { - "TITLE" : "Id", - "DESCRIPTION" : "Identificador único del elemento." - } - }, - "NAMEPACKAGE" : { - "NAME" : { - "TITLE" : "Nombre", - "DESCRIPTION" : "El nombre descriptivo del elemento de BPMN." - } - }, - "DOCUMENTATIONPACKAGE" : { - "DOCUMENTATION" : { - "TITLE" : "Documentación", - "DESCRIPTION" : "La documentación del elemento de BPMN." - } - }, - "CATEGORYPACKAGE" : { - "CATEGORYDEFINITION" : { - "TITLE" : "Categoría", - "DESCRIPTION" : "La categoría del elemento de BPMN." - } - }, - "PROCESS_AUTHORPACKAGE" : { - "PROCESS_AUTHOR" : { - "TITLE" : "Autor del proceso", - "DESCRIPTION" : "Autor de la definiciónd del proceso." - } - }, - "PROCESS_VERSIONPACKAGE" : { - "PROCESS_VERSION" : { - "TITLE" : "Id de la versión del proceso (sólo documentación)", - "DESCRIPTION" : "El identificador de la versión para propósitos de documentación." - } - }, - "PROCESS_HISTORYLEVELPACKAGE" : { - "PROCESS_HISTORYLEVEL" : { - "TITLE" : "Establecer nivel de historial para la definición de este proceso", - "DESCRIPTION" : "Establece un nivel de historial específico para la definición de este proceso" - } - }, - "ISEXECUTABLEPACKAGE" : { - "ISEXECUTABLE" : { - "TITLE" : "Es ejecutable", - "DESCRIPTION" : "¿Es ejecutable este proceso?" - } - }, - "PROCESS_POTENTIALSTARTERUSERPACKAGE" : { - "PROCESS_POTENTIALSTARTERUSER" : { - "TITLE" : "Usuario iniciador potencial", - "DESCRIPTION" : "¿Qué usuario puede iniciar este proceso?" - } - }, - "PROCESS_POTENTIALSTARTERGROUPPACKAGE" : { - "PROCESS_POTENTIALSTARTERGROUP" : { - "TITLE" : "Grupo iniciador potencial", - "DESCRIPTION" : "¿Qué grupo puede iniciar este proceso?" - } - }, - "PROCESS_NAMESPACEPACKAGE" : { - "PROCESS_NAMESPACE" : { - "TITLE" : "Espacio de nombres (target namespace)", - "DESCRIPTION" : "El espacio de nombres (target namespace) de la definición del proceso. Ej: http://www.flowable.org/processdef" - } - }, - "PROCESS_ISEAGEREXECUTIONFETCHPACKAGE" : { - "ISEAGEREXECUTIONFETCH" : { - "TITLE" : "Búsqueda de ejecución previa", - "DESCRIPTION" : "¿Habilitar la búsqueda de ejecución previa (eager execution fetching) de la definición del proceso?" - } - }, - "ASYNCHRONOUSDEFINITIONPACKAGE" : { - "ASYNCHRONOUSDEFINITION" : { - "TITLE" : "Asíncrona", - "DESCRIPTION" : "¿Definir esta actividad como asíncrona?" - } - }, - "DATAPROPERTIESPACKAGE" : { - "DATAPROPERTIES" : { - "TITLE" : "Objetos de datos", - "DESCRIPTION" : "Definición de las propiedades de los objetos de datos" - } - }, - "EXCLUSIVEDEFINITIONPACKAGE" : { - "EXCLUSIVEDEFINITION" : { - "TITLE" : "Exclusiva", - "DESCRIPTION" : "Define la actividad como exclusiva." - } - }, - "EXECUTIONLISTENERSPACKAGE" : { - "EXECUTIONLISTENERS" : { - "TITLE" : "Gestores de eventos de ejecución", - "DESCRIPTION" : "Gestores para una actividad, proceso, flujo de secuencia y eventos de inicio y fin." - } - }, - "TASKLISTENERSPACKAGE" : { - "TASKLISTENERS" : { - "TITLE" : "Gestores de eventos de tarea", - "DESCRIPTION" : "Gestores de eventos para una tarea de usuario" - } - }, - "EVENTLISTENERSPACKAGE" : { - "EVENTLISTENERS" : { - "TITLE" : "Gestores de eventos", - "DESCRIPTION" : "Gestores cualquier evento que ocurra en el Flowable Engine. También es posible relanzar el evento como una señal, mensaje o evento de error" - } - }, - "USERTASKASSIGNMENTPACKAGE" : { - "USERTASKASSIGNMENT" : { - "TITLE" : "Asignaciones", - "DESCRIPTION" : "Definición de la asignación para la tarea de usuario" - } - }, - "FORMPROPERTIESPACKAGE" : { - "FORMPROPERTIES" : { - "TITLE" : "Propiedades del formulario", - "DESCRIPTION" : "Definición del formulario mediante una lista de propiedades" - } - }, - "FORMKEYDEFINITIONPACKAGE" : { - "FORMKEYDEFINITION" : { - "TITLE" : "Clave del formulario", - "DESCRIPTION" : "Clave de identificación de formulario que provee una referencia a un formulario." - } - }, - "FORMFIELDVALIDATIONPACKAGE" : { - "FORMFIELDVALIDATION" : { - "TITLE" : "Validar campos de formulario", - "DESCRIPTION" : "Validar los campos del formulario en el envío. (los valores permitidos son 'true', 'false' or una expresión)" - } - }, - "DUEDATEDEFINITIONPACKAGE" : { - "DUEDATEDEFINITION" : { - "TITLE" : "Fecha de vencimiento", - "DESCRIPTION" : "Fecha de vencimiento de la tarea de usuario." - } - }, - "PRIORITYDEFINITIONPACKAGE" : { - "PRIORITYDEFINITION" : { - "TITLE" : "Prioridad", - "DESCRIPTION" : "Prioridad de la tarea de usuario." - } - }, - "TASKIDVARIABLENAMEPACKAGE": { - "TASKIDVARIABLENAME": { - "TITLE": "Variable para el taskId", - "DESCRIPTION": "Si se establece, el id de la tarea será almacenado en esta variable" - } - }, - "SERVICETASKCLASSPACKAGE" : { - "SERVICETASKCLASS" : { - "TITLE" : "Clase", - "DESCRIPTION" : "Clase de java que implementa la lógica de la tarea de servicio." - } - }, - "SERVICETASKEXPRESSIONPACKAGE" : { - "SERVICETASKEXPRESSION" : { - "TITLE" : "Expresión", - "DESCRIPTION" : "Expresión que define la lógica de la tarea de servicio." - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE" : { - "SERVICETASKDELEGATEEXPRESSION" : { - "TITLE" : "Expresión del delegado", - "DESCRIPTION" : "Expresión del delegado que define la lógica de la tarea de servicio." - } - }, - "SERVICETASKFAILEDJOBRETRYTIMECYCLEPACKAGE" : { - "SERVICETASKFAILEDJOBRETRYTIMECYCLE" : { - "TITLE" : "Tiempo del ciclo de reintento para trabajos fallidos", - "DESCRIPTION" : "Tiempo del ciclo de reintento establecido para la lógica de la tarea de servicio." - } - }, - "SERVICETASKFIELDSPACKAGE" : { - "SERVICETASKFIELDS" : { - "TITLE" : "Campos de clase (java)", - "DESCRIPTION" : "Extensiones de campos" - } - }, - "SERVICETASKEXCEPTIONSPACKAGE" : { - "SERVICETASKEXCEPTIONS" : { - "TITLE" : "Excepciones", - "DESCRIPTION" : "Mapeo de excepciones" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKRESULTVARIABLE" : { - "TITLE" : "Nombre de la variable de resultado", - "DESCRIPTION" : "Nombre de la variable del proceso para almacenar el resultado de la tarea de servicio." - }, - "SERVICETASKUSELOCALSCOPEFORRESULTVARIABLE" : { - "TITLE" : "Usar alcance local para la variable de resultado", - "DESCRIPTION" : "Marca que indica que la variable de resultado se guadará como variable local" - } - }, - "SERVICETASKTRIGGERABLEPACKAGE" : { - "SERVICETASKTRIGGERABLE" : { - "TITLE" : "Configurar la tarea de servicio como disparable", - "DESCRIPTION" : "Configura la tarea de servicio para ser disparable (triggerable)" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "Establecer variable resultante como transitoria", - "DESCRIPTION" : "Atributo que establece que el resultado de la expresión no será persistido al finalizar la transacción de base de datos" - } - }, - "SCRIPTFORMATPACKAGE" : { - "SCRIPTFORMAT" : { - "TITLE" : "Formato del script", - "DESCRIPTION" : "Format del script de la tarea." - } - }, - "SCRIPTTEXTPACKAGE" : { - "SCRIPTTEXT" : { - "TITLE" : "Script", - "DESCRIPTION" : "El código fuente del script de la tarea." - } - }, - "SCRIPTAUTOSTOREVARIABLESPACKAGE" : { - "SCRIPTAUTOSTOREVARIABLES" : { - "TITLE" : "Almacenar variables automáticamente", - "DESCRIPTION" : "Almacenar en el proceso todas las variables del script." - } - }, - "SHELLCOMMANDPACKAGE" : { - "SHELLCOMMAND" : { - "TITLE" : "Comando", - "DESCRIPTION" : "Comando de la tarea de shell" - } - }, - "SHELLARG1PACKAGE" : { - "SHELLARG1" : { - "TITLE" : "Argumento 1", - "DESCRIPTION" : "El argumento 1 del comando de shell" - } - }, - "SHELLARG2PACKAGE" : { - "SHELLARG2" : { - "TITLE" : "Argumento 2", - "DESCRIPTION" : "El argumento 2 del comando de shell" - } - }, - "SHELLARG3PACKAGE" : { - "SHELLARG3" : { - "TITLE" : "Argumento 3", - "DESCRIPTION" : "El argumento 3 del comando de shell" - } - }, - "SHELLARG4PACKAGE" : { - "SHELLARG4" : { - "TITLE" : "Argumento 4", - "DESCRIPTION" : "El argumento 4 del comando de shell" - } - }, - "SHELLARG5PACKAGE" : { - "SHELLARG5" : { - "TITLE" : "Argumento 5", - "DESCRIPTION" : "El argumento 5 del comando de shell" - } - }, - "SHELLWAITPACKAGE" : { - "SHELLWAIT" : { - "TITLE" : "Esperar", - "DESCRIPTION" : "Marca para esperar la finalización del comando de shell" - } - }, - "SHELLOUTPUTVARIABLEPACKAGE" : { - "SHELLOUTPUTVARIABLE" : { - "TITLE" : "Variable de salida", - "DESCRIPTION" : "Variable para almacenar la salida del comando de shell" - } - }, - "SHELLERRORCODEVARIABLEPACKAGE" : { - "SHELLERRORCODEVARIABLE" : { - "TITLE" : "Variable de código de error", - "DESCRIPTION" : "Variable para almacenar el código de error (error code) del comando de shell" - } - }, - "SHELLREDIRECTERRORPACKAGE" : { - "SHELLREDIRECTERROR" : { - "TITLE" : "Redirigir error", - "DESCRIPTION" : "Si es verdadero, combina la salida de error con la salida estándar" - } - }, - "SHELLCLEANENVPACKAGE" : { - "SHELLCLEANENV" : { - "TITLE" : "Limpiar entorno", - "DESCRIPTION" : "Limpiar el entorno de ejecución del shell" - } - }, - "SHELLDIRECTORYPACKAGE" : { - "SHELLDIRECTORY" : { - "TITLE" : "Directorio", - "DESCRIPTION" : "El directorio de trabajo del proceso de shell" - } - }, - "RULETASK_RULESPACKAGE" : { - "RULETASK_RULES" : { - "TITLE" : "Reglas", - "DESCRIPTION" : "Reglas de la tarea" - } - }, - "RULETASK_VARIABLES_INPUTPACKAGE" : { - "RULETASK_VARIABLES_INPUT" : { - "TITLE" : "Variables de entrada", - "DESCRIPTION" : "Variables de entrada de la tarea." - } - }, - "RULETASK_EXCLUDEPACKAGE" : { - "RULETASK_EXCLUDE" : { - "TITLE" : "Excluir", - "DESCRIPTION" : "Usar la propiedad de reglas como exclusión." - } - }, - "RULETASK_RESULTPACKAGE" : { - "RULETASK_RESULT" : { - "TITLE" : "Variable de resultado", - "DESCRIPTION" : "Variable de resultado de la tarea de regla." - } - }, - "MAILTASKHEADERSPACKAGE" : { - "MAILTASKHEADERS" : { - "TITLE" : "Cabeceras", - "DESCRIPTION" : "Cabeceras del email separadas en líneas (por ejemplo, X-Attribute: valor)." - } - }, - "MAILTASKTOPACKAGE" : { - "MAILTASKTO" : { - "TITLE" : "Para", - "DESCRIPTION" : "El destinatario del email. Se pueden definir múltiples destintarios con una lista separada por comas." - } - }, - "MAILTASKFROMPACKAGE" : { - "MAILTASKFROM" : { - "TITLE" : "De", - "DESCRIPTION" : "La dirección del remitente del email. Si no se indica, se utiliza la dirección de remitente predeterminada en la configuración." - } - }, - "MAILTASKSUBJECTPACKAGE" : { - "MAILTASKSUBJECT" : { - "TITLE" : "Asunto", - "DESCRIPTION" : "El asunto del email." - } - }, - "MAILTASKCCPACKAGE" : { - "MAILTASKCC" : { - "TITLE" : "CC", - "DESCRIPTION" : "La dirección que recibirá copia del email. Se pueden definir múltiples destintarios con una lista separada por comas." - } - }, - "MAILTASKBCCPACKAGE" : { - "MAILTASKBCC" : { - "TITLE" : "CCO", - "DESCRIPTION" : "La dirección que recibirá copia oculta del email. Se pueden definir múltiples destintarios con una lista separada por comas." - } - }, - "MAILTASKTEXTPACKAGE" : { - "MAILTASKTEXT" : { - "TITLE" : "Texto", - "DESCRIPTION" : "El contenido del email, en caso de necesitar enviar texto plano (no enriquecido). Puede ser utilizado en combinación con HTML para clientes de email que no soproten contenido enriquecido. En ese caso el cliente recae en esta alternativa de sólo texto." - }, - "MAILTASKTEXTVAR" : { - "TITLE" : "TextVar", - "DESCRIPTION" : "El nombre de la variable del proceso que contiene el texto con el contenido del email, en caso de necesitar enviar texto plano (no enriquecido). Puede ser utilizado en combinación con HTML para clientes de email que no soproten contenido enriquecido. En ese caso el cliente recae en esta alternativa de sólo texto." - } - }, - "MAILTASKHTMLPACKAGE" : { - "MAILTASKHTML" : { - "TITLE" : "Html", - "DESCRIPTION" : "Una porción de HTML que se usa como contenido del email." - }, - "MAILTASKHTMLVAR" : { - "TITLE" : "HtmlVar", - "DESCRIPTION" : "El nombre de la variable del proceso que contiene una porción de HTML que se usa como contenido del email." - } - }, - "MAILTASKCHARSETPACKAGE" : { - "MAILTASKCHARSET" : { - "TITLE" : "Juego de caracteres", - "DESCRIPTION" : "Permite cambiar el juego de caracteres del email, que es necesario para los idiomas diferentes al inglés. " - } - }, - "HTTPTASKREQUESTMETHODPACKAGE" : { - "HTTPTASKREQUESTMETHOD" : { - "TITLE" : "Método de petición", - "DESCRIPTION" : "Método de petición. Por ejemplo, GET,POST,PUT, etc." - } - }, - "HTTPTASKREQUESTURLPACKAGE" : { - "HTTPTASKREQUESTURL" : { - "TITLE" : "URL de la petición", - "DESCRIPTION" : "URL de la petición. Por ejemplo, http://flowable.org." - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE" : { - "HTTPTASKREQUESTHEADERS" : { - "TITLE" : "Cabeceras de la petición", - "DESCRIPTION" : "Cabecereas HTTP separadas en líneas. Por ejemplo, Content-Type: application/json." - } - }, - "HTTPTASKREQUESTBODYPACKAGE" : { - "HTTPTASKREQUESTBODYPACKAGE" : { - "TITLE" : "Cuerpo de la petición", - "DESCRIPTION" : "Cuerpo de la petición. Por ejemplo, ${sampleBody}." - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE" : { - "HTTPTASKREQUESTBODYENCODING" : { - "TITLE" : "Codificación del cuerpo de la petición", - "DESCRIPTION" : "Codificación del cuerpo de la petición. Por ejemplo, UTF-8." - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE" : { - "HTTPTASKREQUESTTIMEOUT" : { - "TITLE" : "Tiempo de espera de la petición", - "DESCRIPTION" : "Tiempo de espera en milisegundos para la petición. Por ejemplo, 5000." - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE" : { - "HTTPTASKDISALLOWREDIRECTS" : { - "TITLE" : "Rechazar redirecciones", - "DESCRIPTION" : "Determina si se rechazan las redirecciones HTTP." - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE" : { - "HTTPTASKFAILSTATUSCODES" : { - "TITLE" : "Códigos de estado de falla", - "DESCRIPTION" : "Lista separada por comas de los códigos de estado en las respuestas HTTP para reintentos (arroja FlowableException). Por ejemplo, 400,5XX." - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE" : { - "HTTPTASKHANDLESTATUSCODES" : { - "TITLE" : "Códigos de estado de manejo", - "DESCRIPTION" : "Lista separada por comas de los códigos de estado en las respuestas HTTP para ignorar (arroja BPMNError). Por ejemplo, 404,3XX." - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE" : { - "HTTPTASKIGNOREEXCEPTION" : { - "TITLE" : "Ignorar excepciones", - "DESCRIPTION" : "Determina si se ignoran las excepciones" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT" : { - "TITLE" : "Guardar respuesta como variable transient", - "DESCRIPTION" : "Determina si se debe almacenar las respuesta como variable(s) transient" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE" : { - "HTTPTASKSAVERESPONSEASJSON" : { - "TITLE" : "Guardar respuesta como JSON", - "DESCRIPTION" : "Determina si se guarda la variable de respuesta como JSON en lugar de String" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that when using parallel gateways multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the process is faster." - } - }, - "SKIPEXPRESSIONPACKAGE" : { - "SKIPEXPRESSION" : { - "TITLE" : "Expresión de salto", - "DESCRIPTION" : "Expresión que indica, en caso de resultar verdadera, si debe saltarse la tarea." - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE" : { - "HTTPTASKRESPONSEVARIABLENAME" : { - "TITLE" : "Nombre de la variable de respuesta", - "DESCRIPTION" : "Define el nombre de la variable para almacenar la respuesta HTTP." - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE" : { - "HTTPTASKSAVEREQUESTVARIABLES" : { - "TITLE" : "Guardar variables de la solicitud", - "DESCRIPTION" : "Determina si se guardan las variables de la solicitud." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERS" : { - "TITLE" : "Guardar estado de respuesta y cabeceras", - "DESCRIPTION" : "Determinan si se guarda el estado de respuesta, cabeceras, etc." - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE" : { - "HTTPTASKRESULTVARIABLEPREFIX" : { - "TITLE" : "Prefijo de la variable de resultado", - "DESCRIPTION" : "Prefijo para los nombres de variables de ejecución." - } - }, - "CALLACTIVITYCALLEDELEMENTPACKAGE" : { - "CALLACTIVITYCALLEDELEMENT" : { - "TITLE" : "Elemento al que se llama", - "DESCRIPTION" : "Referencia al proceso." - } - }, - "CALLACTIVITYCALLEDELEMENTTYPEPACKAGE" : { - "CALLACTIVITYCALLEDELEMENTTYPE" : { - "TITLE" : "Tipo de elemento al que se llama", - "DESCRIPTION" : "Tipo de referencia del proceso utilizado." - } - }, - "CALLACTIVITYINPARAMETERSPACKAGE" : { - "CALLACTIVITYINPARAMETERS" : { - "TITLE" : "Parámetros de entrada", - "DESCRIPTION" : "Definición de los parámetros de entrada" - } - }, - "CALLACTIVITYOUTPARAMETERSPACKAGE" : { - "CALLACTIVITYOUTPARAMETERS" : { - "TITLE" : "Parámetros de salida", - "DESCRIPTION" : "Definición de los parámetros de salida" - } - }, - "CALLACTIVITYINHERITVARIABLESPACKAGE" : { - "CALLACTIVITYINHERITVARIABLES" : { - "TITLE" : "Heredar variables en subproceso", - "DESCRIPTION" : "Hereda las variables del proceso padre en el subproceso" - } - }, - "CALLACTIVITYSAMEDEPLOYMENTPACKAGE" : { - "CALLACTIVITYSAMEDEPLOYMENT" : { - "TITLE" : "Iniciar el proceso referido desde el mismo despliegue", - "DESCRIPTION" : "Usar el proceso referido del mismo despliegue." - } - }, - "CALLACTIVITYFALLBACKTODEFAULTTENANTPACKAGE" : { - "CALLACTIVITYFALLBACKTODEFAULTTENANT" : { - "TITLE" : "Recaer en el tenant predeterminado", - "DESCRIPTION" : "Buscar la definición por clave en el tenant predeterminado cuando falle la búsqueda en el tenant actual." - } - }, - "CALLACTIVITYIDVARIABLENAMEPACKAGE": { - "CALLACTIVITYIDVARIABLENAME": { - "TITLE": "Id de variable", - "DESCRIPTION": "Si está establecido, el id de la instancia iniciada será almacenado en esta variable" - } - }, - "CALLACTIVITYPROCESSINSTANCENAMEPACKAGE" : { - "CALLACTIVITYPROCESSINSTANCENAME" : { - "TITLE" : "Nombre de la instancia del proceso", - "DESCRIPTION" : "Una expresión que resuelva el nombre de la instancia de proceso hija" - } - }, - "CALLACTIVITYINHERITBUSINESSKEYPACKAGE" : { - "CALLACTIVITYINHERITBUSINESSKEY" : { - "TITLE" : "Heredar clave de negocio", - "DESCRIPTION" : "Hereda la clave de indentificación de negocio del proceso padre." - } - }, - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERSPACKAGE" : { - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERS" : { - "TITLE" : "Usar alcance local para los parámetros de salida", - "DESCRIPTION" : "Usa alcance local para los parámetros de salida." - } - }, - "CALLACTIVITYBUSINESSKEYPACKAGE" : { - "CALLACTIVITYBUSINESSKEY" : { - "TITLE" : "Expresión de la clave de negocio", - "DESCRIPTION" : "Una expresión que resuelve la clave de identificación de negocio para la instancia de proceso hija" - } - }, - "CALLACTIVITYCOMPLETEASYNCPACKAGE" : { - "CALLACTIVITYCOMPLETEASYNC" : { - "TITLE" : "Completar asincrónicamente", - "DESCRIPTION" : "Si se establece, la actividad de llamada se finaliza y completa de manera asincrónica. Es útil cuando se usan instancias múltiples paralelas y la definición de proceso llamado tiene tareas asincrónicas." - } - }, - "CAMELTASKCAMELCONTEXTPACKAGE" : { - "CAMELTASKCAMELCONTEXT" : { - "TITLE" : "Contexto Camel", - "DESCRIPTION" : "Definición opcional del contexto Camel. Si se deja vacío se utiliza el predeterminado." - } - }, - "MULETASKENDPOINTURLPACKAGE" : { - "MULETASKENDPOINTURL" : { - "TITLE" : "URL del endpoint", - "DESCRIPTION" : "Se requiere la url del endpoint para enviar los mensajes a Mule." - } - }, - "MULETASKLANGUAGEPACKAGE" : { - "MULETASKLANGUAGE" : { - "TITLE" : "Lenguaje", - "DESCRIPTION" : "Se requiere la definición del lenguaje para resolver la expresión de la carga útil, como juel." - } - }, - "MULETASKPAYLOADEXPRESSIONPACKAGE" : { - "MULETASKPAYLOADEXPRESSION" : { - "TITLE" : "Expresión de la carga útil", - "DESCRIPTION" : "Se requiere la definición de la carga útil del mensaje a ser enviado a Mule." - } - }, - "MULETASKRESULTVARIABLEPACKAGE" : { - "MULETASKRESULTVARIABLE" : { - "TITLE" : "Variable de resultado", - "DESCRIPTION" : "Una variable de resultado opcional para la carga útil recibida." - } - }, - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "TITLE" : "Condición del flujo", - "DESCRIPTION" : "La condición de la secuencia de flujo" - } - }, - "DEFAULTFLOWPACKAGE" : { - "DEFAULTFLOW" : { - "TITLE" : "Flujo predeterminado", - "DESCRIPTION" : "Define la secuencia del flujo como predeterminada" - } - }, - "CONDITIONALFLOWPACKAGE" : { - "CONDITIONALFLOW" : { - "TITLE" : "Fujo condicional", - "DESCRIPTION" : "Define la secuencia del flujo con una condición" - } - }, - "TIMERCYCLEDEFINITIONPACKAGE" : { - "TIMERCYCLEDEFINITION" : { - "TITLE" : "Ciclo del temporizador (e.g. R3/PT10H)", - "DESCRIPTION" : "Define el temporizador con un ciclo según la norma ISO-8601" - } - }, - "TIMERDATEDEFINITIONPACKAGE" : { - "TIMERDATEDEFINITION" : { - "TITLE" : "Fecha del temporizador en ISO-8601", - "DESCRIPTION" : "Define la fecha del temporizador según la norma ISO-8601." - } - }, - "TIMERDURATIONDEFINITIONPACKAGE" : { - "TIMERDURATIONDEFINITION" : { - "TITLE" : "Duración del temporizador (e.g. PT5M)", - "DESCRIPTION" : "Define la duración del temporizador según la norma ISO-8601." - } - }, - "TIMERENDDATEDEFINITIONPACKAGE" : { - "TIMERENDDATEDEFINITION" : { - "TITLE" : "Fecha de fin del temporizador en ISO-8601", - "DESCRIPTION" : "Define la fecha de fin del temporizador según la norma ISO-8601." - } - }, - "MESSAGEREFPACKAGE" : { - "MESSAGEREF" : { - "TITLE" : "Referencia del mensaje", - "DESCRIPTION" : "Define el nombre del mensaje." - } - }, - "SIGNALREFPACKAGE" : { - "SIGNALREF" : { - "TITLE" : "Referencia de señal", - "DESCRIPTION" : "Define el nombre de la señal." - } - }, - "COMPENSATIONACTIVITYREFPACKAGE" : { - "COMPENSATIONACTIVITYREF" : { - "TITLE" : "Referencia de la actividad de compensación", - "DESCRIPTION" : "Defina la referencia de actividad." - } - }, - "ERRORREFPACKAGE" : { - "ERRORREF" : { - "TITLE" : "Referencia de error", - "DESCRIPTION" : "Define el nombre del error." - } - }, - "ESCALATIONREFPACKAGE" : { - "ESCALATIONREF" : { - "TITLE" : "Referencia de escalamiento", - "DESCRIPTION" : "Define el nombre del escalamiento." - } - }, - "CONDITIONALEVENTPACKAGE" : { - "CONDITION" : { - "TITLE" : "Expresión de condición", - "DESCRIPTION" : "Define la expresión de la condición para el evento condicional." - } - }, - "CANCELACTIVITYPACKAGE" : { - "CANCELACTIVITY" : { - "TITLE" : "Cancelar actividad", - "DESCRIPTION" : "Indica si se debe cancelar la actividad" - } - }, - "INITIATORPACKAGE" : { - "INITIATOR" : { - "TITLE" : "Iniciador", - "DESCRIPTION" : "Iniciador del proceso." - } - }, - "TEXTPACKAGE" : { - "TEXT" : { - "TITLE" : "Texto", - "DESCRIPTION" : "El texto de la anotación" - } - }, - "MULTIINSTANCE_TYPEPACKAGE" : { - "MULTIINSTANCE_TYPE" : { - "TITLE" : "Tipo de multi-instancia", - "DESCRIPTION" : "Las ejecución de actividades repetitivas (paralelas o secuenciales) se pueden mostrar a través de diferentes tipos de bucles" - } - }, - "MULTIINSTANCE_CARDINALITYPACKAGE" : { - "MULTIINSTANCE_CARDINALITY" : { - "TITLE" : "Cardinalidad (multi-instancia)", - "DESCRIPTION" : "Define la cardinalidad de la multi-instancia" - } - }, - "MULTIINSTANCE_COLLECTIONPACKAGE" : { - "MULTIINSTANCE_COLLECTION" : { - "TITLE" : "Colección (multi-instancia)", - "DESCRIPTION" : "Define la colección para la multi-instancia." - } - }, - "MULTIINSTANCE_VARIABLEPACKAGE" : { - "MULTIINSTANCE_VARIABLE" : { - "TITLE" : "Variable de elemento (multi-instancia)", - "DESCRIPTION" : "Define la variable del elemento para la multi-instancia." - } - }, - "MULTIINSTANCE_CONDITIONPACKAGE" : { - "MULTIINSTANCE_CONDITION" : { - "TITLE" : "Condición de conclusión (multi-instancia)", - "DESCRIPTION" : "Define the la condición de conclusión for la multi-instancia." - } - }, - "ISFORCOMPENSATIONPACKAGE" : { - "ISFORCOMPENSATION" : { - "TITLE" : "Es para compensación", - "DESCRIPTION" : "Determina si la actividad tiene propósitos de compensación." - } - }, - "SEQUENCEFLOWORDERPACKAGE" : { - "SEQUENCEFLOWORDER" : { - "TITLE" : "Orden del flujo", - "DESCRIPTION" : "Ordena los flujos de secuencia salientes" - } - }, - "SIGNALDEFINITIONSPACKAGE" : { - "SIGNALDEFINITIONS" : { - "TITLE" : "Definiciones de señal", - "DESCRIPTION" : "Definiciones de señal" - } - }, - "MESSAGEDEFINITIONSPACKAGE" : { - "MESSAGEDEFINITIONS" : { - "TITLE" : "Definiciones de mensaje", - "DESCRIPTION" : "Definiciones de mensaje" - } - }, - "ESCALATIONDEFINITIONSPACKAGE" : { - "ESCALATIONDEFINITIONS" : { - "TITLE" : "Definiciones de escalamiento", - "DESCRIPTION" : "Definiciones de escalamiento" - } - }, - "EVENTREGISTRYPACKAGE" : { - "EVENTKEY" : { - "TITLE" : "Clave del evento", - "DESCRIPTION" : "Definición de la calve de identificación del evento" - }, - "EVENTNAME" : { - "TITLE" : "Nombre de evento", - "DESCRIPTION" : "Definición del nombre del evento" - }, - "EVENTINPARAMETERS" : { - "TITLE" : "Mapeo hacia carga útil del evento", - "DESCRIPTION" : "Mapeo de las variables del proceso a las propiedades de la carga útil del evento" - }, - "EVENTOUTPARAMETERS" : { - "TITLE" : "Mapeo desde la carga util del evento", - "DESCRIPTION" : "Mapeo de las propiedades de la carga útil del evento a las variables del proceso" - }, - "EVENTCORRELATIONPARAMETERS" : { - "TITLE" : "Parámetros de correlación", - "DESCRIPTION" : "Definición de los parámetros de correlación" - }, - "CHANNELKEY" : { - "TITLE" : "Clave del canal", - "DESCRIPTION" : "Definición de la clave de identificación del canal" - }, - "CHANNELNAME" : { - "TITLE" : "Nombre del canal", - "DESCRIPTION" : "Definición del nombre del canal" - }, - "CHANNELTYPE" : { - "TITLE" : "Tipo de canal", - "DESCRIPTION" : "Definición del tipo de canal" - }, - "CHANNELDESTINATION" : { - "TITLE" : "Destino del canal", - "DESCRIPTION" : "Definición del destino del canal" - }, - "TRIGGEREVENTKEY" : { - "TITLE" : "Clave del disparador de evento", - "DESCRIPTION" : "Definción de la clave de identificación del disparador de evento" - }, - "TRIGGEREVENTNAME" : { - "TITLE" : "Nombre del disparador de evento", - "DESCRIPTION" : "Definición del nombre del disparador de evento" - }, - "TRIGGERCHANNELKEY" : { - "TITLE" : "Clave del canal disparador", - "DESCRIPTION" : "Definición de la clave de identificación del canal disparador" - }, - "TRIGGERCHANNELNAME" : { - "TITLE" : "Nombre del canal disparador", - "DESCRIPTION" : "Definición del nombre del canal disparador" - }, - "TRIGGERCHANNELTYPE" : { - "TITLE" : "Tipo de canal disparador", - "DESCRIPTION" : "Definición del tipo de canal disparador" - }, - "TRIGGERCHANNELDESTINATION" : { - "TITLE" : "Destino del canal disparador", - "DESCRIPTION" : "Definición del destino del canal disparador" - }, - "KEYDETECTIONFIXEDVALUE" : { - "TITLE" : "Valor fijo de la clave del evento", - "DESCRIPTION" : "Definición del valor fijo de la clave de identificación de evento" - }, - "KEYDETECTIONJSONFIELD" : { - "TITLE" : "Campo JSON de la clave del evento", - "DESCRIPTION" : "Definición de la detección de la clave de identificación de evento con un campo JSON" - }, - "KEYDETECTIONJSONPOINTER" : { - "TITLE" : "Puntero JSON de la clave del evento", - "DESCRIPTION" : "Definición de la detección de la clave de identificación de evento con la expresión de un puntero JSON" - } - }, - "ISTRANSACTIONPACKAGE" : { - "ISTRANSACTION" : { - "TITLE" : "Es un subproceso de transacción", - "DESCRIPTION" : "Determina si este subproceso es de tipo transacción." - } - }, - "FORMREFERENCEPACKAGE" : { - "FORMREFERENCE" : { - "TITLE" : "Referencia al formulario", - "DESCRIPTION" : "Referencia a un formulario" - } - }, - "TERMINATEALLPACKAGE" : { - "TERMINATEALL" : { - "TITLE" : "Finalizar todo", - "DESCRIPTION" : "Habilita a finalizar la instancia del proceso" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE" : { - "DECISIONTASKDECISIONTABLEREFERENCE" : { - "TITLE" : "Referencia a tabla de decisión", - "DESCRIPTION" : "Establece una referencia a una tabla de decisión" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE" : { - "DECISIONTASKTHROWERRORONNOHITS" : { - "TITLE" : "Arrojar error si no coinciden reglas", - "DESCRIPTION" : "Inidica si debe arrojar error cuando no haya reglas en la tabla de decisión que coincidan y, en consecuencia, no haya resultados." - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE" : { - "DECISIONTASKFALLBACKTODEFAULTTENANT" : { - "TITLE" : "Recaer en el tenant predeterminado", - "DESCRIPTION" : "Buscar definciones de decisión sin tenant cuando fallan los intentos previos para encontrar definiciones con tenant." - } - }, - "INTERRUPTINGPACKAGE" : { - "INTERRUPTING" : { - "TITLE" : "Interrupir", - "DESCRIPTION" : "¿Deben finalizar todas las ejecuciones padre?" - } - }, - "COMPLETIONCONDITIONPACKAGE" : { - "COMPLETIONCONDITION" : { - "TITLE" : "Condición de compleción", - "DESCRIPTION" : "La condición de compleción para el subproceso adhoc" - } - }, - "ORDERINGPACKAGE" : { - "ORDERING" : { - "TITLE" : "Ordenamiento", - "DESCRIPTION" : "El ordenamiento para el subproceso adhoc" - } - }, - "CANCELREMAININGINSTANCESPACKAGE" : { - "CANCELREMAININGINSTANCES" : { - "TITLE" : "Cancelar las instancias restantes", - "DESCRIPTION" : "¿Cancelar las instancias restantes del subproceso adhoc?" - } - } - - }, - "STENCILS" : { - "GROUPS" : { - "STARTEVENTS" : "Eventos de inicio", - "ENDEVENTS" : "Eventos de fin", - "DIAGRAM" : "Diagrama", - "ACTIVITIES" : "Actividades", - "STRUCTURAL" : "Estructura", - "GATEWAYS" : "Puertas de enlace", - "BOUNDARYEVENTS" : "Eventos de frontera", - "INTERMEDIATECATCHINGEVENTS" : "Eventos intermedios de captura", - "INTERMEDIATETHROWINGEVENTS" : "Eventos intermedios de lanzamiento", - "SWIMLANES" : "Carriles", - "CONNECTINGOBJECTS" : "Objetos conectores", - "ARTIFACTS" : "Artefactos" - }, - "BPMNDIAGRAM" : { - "TITLE" : "Diagrama BPMN", - "DESCRIPTION" : "Un diagrama BPMN 2.0." - }, - "STARTNONEEVENT" : { - "TITLE" : "Evento de incio", - "DESCRIPTION" : "Un evento de inicio sin un disparador específico" - }, - "STARTTIMEREVENT" : { - "TITLE" : "Evento de inicio temporizado", - "DESCRIPTION" : "In evento de incio disparado por un temporizador" - }, - "STARTSIGNALEVENT" : { - "TITLE" : "Evento de incio de señal", - "DESCRIPTION" : "Un evento de inicio disparado por una señal" - }, - "STARTMESSAGEEVENT" : { - "TITLE" : "Evento de inicio de mensaje", - "DESCRIPTION" : "Un evento de inicio disparado por un mensaje" - }, - "STARTEVENTREGISTRYEVENT" : { - "TITLE" : "Evento de inicio de registración", - "DESCRIPTION" : "Un evento de inicio disparado por una registración" - }, - "STARTCONDITIONALEVENT" : { - "TITLE" : "Evento de inicio condicional", - "DESCRIPTION" : "Un evento de inicio que evalúa un evento condicional" - }, - "STARTERROREVENT" : { - "TITLE" : "Evento de inicio de error", - "DESCRIPTION" : "Un evento de inicio que captura un error BPMN" - }, - "STARTESCALATIONEVENT" : { - "TITLE" : "Evento de inicio de escalamiento", - "DESCRIPTION" : "Un evento de inicio que captura un escalamiento BPMN" - }, - "USERTASK" : { - "TITLE" : "Tarea de usuario", - "DESCRIPTION" : "Una tarea manual asignada a un usuario específico" - }, - "SERVICETASK" : { - "TITLE" : "Tarea de servicio", - "DESCRIPTION" : "Una tarea automática con una lógica de servicio" - }, - "SCRIPTTASK" : { - "TITLE" : "Tarea de script", - "DESCRIPTION" : "Una tarea automática con una lógica de script (guión)" - }, - "BUSINESSRULE" : { - "TITLE" : "Tarea de regla de negocio", - "DESCRIPTION" : "Una tarea automática con una lógica de reglas" - }, - "RECEIVETASK" : { - "TITLE" : "Tarea de recepción", - "DESCRIPTION" : "Una tarea que espera una señal" - }, - "MANUALTASK" : { - "TITLE" : "Tarea manual", - "DESCRIPTION" : "Una tarea sin una lógica" - }, - "MAILTASK" : { - "TITLE" : "Tarea de email", - "DESCRIPTION" : "Una tarea de email" - }, - "CAMELTASK" : { - "TITLE" : "Tarea de Camel", - "DESCRIPTION" : "Una tarea que envía un mensaje a Camel" - }, - "HTTPTASK" : { - "TITLE" : "Tarea de HTTP", - "DESCRIPTION" : "Una tarea que usa HTTP" - }, - "MULETASK" : { - "TITLE" : "Tarea de Mule", - "DESCRIPTION" : "Una tarea que envía un mensaje a Mule" - }, - "SENDTASK" : { - "TITLE" : "Tarea de envío", - "DESCRIPTION" : "Una tarea que envía un mensaje" - }, - "DECISIONTASK" : { - "TITLE" : "Tarea de decisión", - "DESCRIPTION" : "Una tarea que utiliza el motor de reglas Flowable DMN" - }, - "SENDEVENTTASK" : { - "TITLE" : "Tarea de envío de evento", - "DESCRIPTION" : "Una tarea que envía un evento al registro de eventos" - }, - "SHELLTASK" : { - "TITLE" : "Tarea de shell", - "DESCRIPTION" : "Una tarea automática con una lógica de shell batch" - }, - "SUBPROCESS" : { - "TITLE" : "Subproceso", - "DESCRIPTION" : "Un ámbito de subproceso" - }, - "COLLAPSEDSUBPROCESS" : { - "TITLE" : "Subproceso colapsado", - "DESCRIPTION" : "Un ámbito de subproceso" - }, - "EVENTSUBPROCESS" : { - "TITLE" : "Subproceso de evento", - "DESCRIPTION" : "Un ámbito de subproceso de evento" - }, - "CALLACTIVITY" : { - "TITLE" : "Actividad de llamada", - "DESCRIPTION" : "Una actividad de llamada" - }, - "EXCLUSIVEGATEWAY" : { - "TITLE" : "Puerta de enlace exclusiva", - "DESCRIPTION" : "Una puerta de enlace que indica opción" - }, - "PARALLELGATEWAY" : { - "TITLE" : "Puerta de enlace paralela", - "DESCRIPTION" : "Una puerta de enlace paralela" - }, - "INCLUSIVEGATEWAY" : { - "TITLE" : "Puerta de enlace inclusiva", - "DESCRIPTION" : "Una puerta de enlace inclusiva" - }, - "EVENTGATEWAY" : { - "TITLE" : "Puerta de enlace de evento", - "DESCRIPTION" : "Una puerta de enlace de evento" - }, - "BOUNDARYCONDITIONALEVENT" : { - "TITLE" : "Evento frontera condicional", - "DESCRIPTION" : "Un evento de frontera que evalúa un evento condicional" - }, - "BOUNDARYERROREVENT" : { - "TITLE" : "Evento frontera de error", - "DESCRIPTION" : "Un evento de frontera que captura un error BPMN" - }, - "BOUNDARYESCALATIONEVENT" : { - "TITLE" : "Evento frontera de escalamiento", - "DESCRIPTION" : "Un evento de frontera que captura un escalamiento BPMN" - }, - "BOUNDARYTIMEREVENT" : { - "TITLE" : "Evento frontera temporizado", - "DESCRIPTION" : "Un evento de frontera disparado por un temporizador" - }, - "BOUNDARYSIGNALEVENT" : { - "TITLE" : "Evento frontera de señal", - "DESCRIPTION" : "Un evento de frontera disparado por una señal" - }, - "BOUNDARYMESSAGEEVENT" : { - "TITLE" : "Evento frontera de mensaje", - "DESCRIPTION" : "Un evento de frontera disparado por un mensaje" - }, - "BOUNDARYCANCELEVENT" : { - "TITLE" : "Evento frontera de cancelación", - "DESCRIPTION" : "Un evento de cancelación de frontera" - }, - "BOUNDARYEVENTREGISTRYEVENT" : { - "TITLE" : "Evento frontera de registración", - "DESCRIPTION" : "Un evento de registración de frontera" - }, - "BOUNDARYCOMPENSATIONEVENT" : { - "TITLE" : "Evento frontera de compensación", - "DESCRIPTION" : "Un evento de compensación de frontera" - }, - "CATCHTIMEREVENT" : { - "TITLE" : "Evento intermedio de captura temporizado", - "DESCRIPTION" : "Un evento intermedio de captura disparado por un temporizador" - }, - "CATCHSIGNALEVENT" : { - "TITLE" : "Evento intermedio de captura de señal", - "DESCRIPTION" : "Un evento intermedio de captura disparado por una señal" - }, - "CATCHMESSAGEEVENT" : { - "TITLE" : "Evento intermedio de captura de mensaje", - "DESCRIPTION" : "Un evento intermedio de captura disparado por un mensaje" - }, - "CATCHCONDITIONALEVENT" : { - "TITLE" : "Evento intermedio de captura condicional", - "DESCRIPTION" : "Un evento intermedio de captura disparado por una condición" - }, - "THROWNONEEVENT" : { - "TITLE" : "Evento intermedio sin lanzamiento", - "DESCRIPTION" : "Un evento intermedio sin un disparador específico" - }, - "THROWSIGNALEVENT" : { - "TITLE" : "Evento intermedio de lanzamiento de señal", - "DESCRIPTION" : "Un evento intermedio con un disparador de señal" - }, - "THROWESCALATIONEVENT" : { - "TITLE" : "Evento intermedio de lanzamiento de escalamiento", - "DESCRIPTION" : "Un evento intermedio con un disparador de escalamiento" - }, - "THROWCOMPENSATIONEVENT": { - "TITLE" : "Evento de lanzamiento de compensación intermedia", - "DESCRIPTION" : "Un evento intermedio con un disparador de compensación" - }, - "ENDNONEEVENT" : { - "TITLE" : "Evento de fin", - "DESCRIPTION" : "Un evento de fin sin un disparador específico" - }, - "ENDERROREVENT" : { - "TITLE" : "Evento de fin con error", - "DESCRIPTION" : "Un evento de fin que evento de error" - }, - "ENDESCALATIONEVENT" : { - "TITLE" : "Evento de fin con escalamiento", - "DESCRIPTION" : "Un evento de fin que lanza un evento de escalamiento" - }, - "ENDCANCELEVENT" : { - "TITLE" : "Evento de fin con cancelación", - "DESCRIPTION" : "Un evento de fin con cancelación" - }, - "ENDTERMINATEEVENT" : { - "TITLE" : "Evento de fin con terminación", - "DESCRIPTION" : "Un evento de fin con terminación" - }, - "POOL" : { - "TITLE" : "Piscina", - "DESCRIPTION" : "Una psichina para estructura la definición de procesos" - }, - "LANE" : { - "TITLE" : "Carril", - "DESCRIPTION" : "Un carril para estructurar la definción de procesos" - }, - "SEQUENCEFLOW" : { - "TITLE" : "Flujo de secuencia", - "DESCRIPTION" : "El flujo de secuencia define el orden de ejecución de las actividades." - }, - "MESSAGEFLOW" : { - "TITLE" : "Flujo de mensaje", - "DESCRIPTION" : "El fujo de mensaje conecta elementos en diferentes piscinas." - }, - "ASSOCIATION" : { - "TITLE" : "Asociación", - "DESCRIPTION" : "Asocia una antoación de texto con un elemento." - }, - "DATAASSOCIATION" : { - "TITLE" : "Asociación de datos", - "DESCRIPTION" : "Asocia un elemento de datos con una actividad." - }, - "TEXTANNOTATION" : { - "TITLE" : "Anotación de texto", - "DESCRIPTION" : "Anota un elemento con una descrpción de texto." - }, - "DATASTORE" : { - "TITLE" : "Almacenamiento de datos", - "DESCRIPTION" : "Referencia a un almacenamiento de datos." - }, - "ADHOCSUBPROCESS" : { - "TITLE" : "Subproceso adhoc", - "DESCRIPTION" : "Un subproceso adhoc" - } - } - }, - - "CMMN" : { - "TITLE": "Editor CMMN", - "DESCRIPTION": "Editor de casos CMMN", - "PROPERTYPACKAGES": { - "CASE_IDPACKAGE": { - "CASE_ID": { - "TITLE": "Identificador del acso", - "DESCRIPTION": "Identificador único de la definición del caso." - } - }, - "OVERRIDEIDPACKAGE": { - "OVERRIDEID": { - "TITLE": "Id", - "DESCRIPTION": "Identificador único del elemento." - } - }, - "NAMEPACKAGE": { - "NAME": { - "TITLE": "Nombre", - "DESCRIPTION": "Nombre descriptivo del elemento CMMN." - } - }, - "DOCUMENTATIONPACKAGE": { - "DOCUMENTATION": { - "TITLE": "Documentación", - "DESCRIPTION": "Documentación del elemento CMMN." - } - }, - "BLOCKINGPACKAGE": { - "ISBLOCKING": { - "TITLE": "Bloqueo", - "DESCRIPTION": "Propiedad booleana, por defecto true. Si es false, la tarea automáticamente se completa luego de ejecutar la lógica asciada" - }, - "ISBLOCKINGEXPRESSION": { - "TITLE": "Expresión de bloqueo", - "DESCRIPTION": "Una expresión de control en tiempo de ejecución que indica si esta tarea se bloquea o no. Si se establece, el valor de la propiedad Bloqueo se ignora." - } - }, - "CASE_INITIATORVARIABLENAMEPACKAGE": { - "CASE_INITIATORVARIABLENAME": { - "TITLE": "Nombre de variable de iniciador", - "DESCRIPTION": "Establece el nombre de la variable para ser usada para el valor del iniciador del caso." - } - }, - "CASE_AUTHORPACKAGE": { - "CASE_AUTHOR": { - "TITLE": "Autor del acso", - "DESCRIPTION": "Autor de la definición del caso." - } - }, - "CASE_VERSIONPACKAGE": { - "CASE_VERSION": { - "TITLE": "Id de la versión del caso (sólo documentación)", - "DESCRIPTION" : "El identificador de la versión para propósitos de documentación." - } - }, - "CASE_NAMESPACEPACKAGE": { - "CASE_NAMESPACE": { - "TITLE" : "Espacio de nombres (target namespace)", - "DESCRIPTION" : "El espacio de nombres (target namespace) de la definición del caso." - } - }, - "USERTASKASSIGNMENTPACKAGE": { - "USERTASKASSIGNMENT": { - "TITLE": "Asignaciones", - "DESCRIPTION": "Definición de asignaciones para la tarea del usuario" - } - }, - "TASKLISTENERSPACKAGE": { - "TASKLISTENERS": { - "TITLE": "Gestores de eventos de tarea", - "DESCRIPTION": "Gestores de eventos para una tarea de usuario" - } - }, - "FORMPROPERTIESPACKAGE": { - "FORMPROPERTIES": { - "TITLE": "Propiedades del formulario", - "DESCRIPTION": "Definición del formulario con una lista de propiuedades de formulario" - } - }, - "FORMKEYDEFINITIONPACKAGE": { - "FORMKEYDEFINITION": { - "TITLE": "Clave del formulario", - "DESCRIPTION": "Clave de identificación de formulario que provee una referencia a un formulario." - } - }, - "FORMFIELDVALIDATIONPACKAGE": { - "FORMFIELDVALIDATION": { - "TITLE": "Validar campos de formulario", - "DESCRIPTION" : "Validar los campos del formulario en el envío. (los valores permitidos son 'true', 'false' or una expresión)" - } - }, - "DUEDATEDEFINITIONPACKAGE" : { - "DUEDATEDEFINITION" : { - "TITLE" : "Fecha de vencimiento", - "DESCRIPTION" : "Fecha de vencimiento de la tarea de usuario." - } - }, - "PRIORITYDEFINITIONPACKAGE" : { - "PRIORITYDEFINITION" : { - "TITLE" : "Prioridad", - "DESCRIPTION" : "Prioridad de la tarea de usuario." - } - }, - "TASKIDVARIABLENAMEPACKAGE": { - "TASKIDVARIABLENAME": { - "TITLE": "Variable para el taskId", - "DESCRIPTION": "Si se establece, el id de la tarea será almacenado en esta variable" - } - }, - "SERVICETASKCLASSPACKAGE" : { - "SERVICETASKCLASS" : { - "TITLE" : "Clase", - "DESCRIPTION" : "Clase de java que implementa la lógica de la tarea de servicio." - } - }, - "SERVICETASKEXPRESSIONPACKAGE" : { - "SERVICETASKEXPRESSION" : { - "TITLE" : "Expresión", - "DESCRIPTION" : "Expresión que define la lógica de la tarea de servicio." - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE" : { - "SERVICETASKDELEGATEEXPRESSION" : { - "TITLE" : "Expresión del delegado", - "DESCRIPTION" : "Expresión del delegado que define la lógica de la tarea de servicio." - } - }, - "SERVICETASKFIELDSPACKAGE" : { - "SERVICETASKFIELDS" : { - "TITLE" : "Campos de clase (java)", - "DESCRIPTION" : "Extensiones de campos" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKRESULTVARIABLE" : { - "TITLE" : "Nombre de la variable de resultado", - "DESCRIPTION" : "Nombre de la variable del proceso para almacenar el resultado de la tarea de servicio." - } - }, - "ASYNCPACKAGE": { - "ISASYNC": { - "TITLE": "Asincrónico", - "DESCRIPTION": "Indica si la tarea necesita ser ejecutada de manera asincrónica." - }, - "ISEXCLUSIVE": { - "TITLE": "Exclusiva", - "DESCRIPTION": "Indica si una tarea asincrónica necesita ser ejecutada de manera exclusiva" - } - }, - "MAILTASKHEADERSPACKAGE" : { - "MAILTASKHEADERS" : { - "TITLE" : "Cabeceras", - "DESCRIPTION" : "Cabeceras del email separadas en líneas (por ejemplo, X-Attribute: valor)." - } - }, - "MAILTASKTOPACKAGE" : { - "MAILTASKTO" : { - "TITLE" : "Para", - "DESCRIPTION" : "El destinatario del email. Se pueden definir múltiples destintarios con una lista separada por comas." - } - }, - "MAILTASKFROMPACKAGE" : { - "MAILTASKFROM" : { - "TITLE" : "De", - "DESCRIPTION" : "La dirección del remitente del email. Si no se indica, se utiliza la dirección de remitente predeterminada en la configuración." - } - }, - "MAILTASKSUBJECTPACKAGE" : { - "MAILTASKSUBJECT" : { - "TITLE" : "Asunto", - "DESCRIPTION" : "El asunto del email." - } - }, - "MAILTASKCCPACKAGE" : { - "MAILTASKCC" : { - "TITLE" : "CC", - "DESCRIPTION" : "La dirección que recibirá copia del email. Se pueden definir múltiples destintarios con una lista separada por comas." - } - }, - "MAILTASKBCCPACKAGE" : { - "MAILTASKBCC" : { - "TITLE" : "CCO", - "DESCRIPTION" : "La dirección que recibirá copia oculta del email. Se pueden definir múltiples destintarios con una lista separada por comas." - } - }, - "MAILTASKTEXTPACKAGE" : { - "MAILTASKTEXT" : { - "TITLE" : "Texto", - "DESCRIPTION" : "El contenido del email, en caso de necesitar enviar texto plano (no enriquecido). Puede ser utilizado en combinación con HTML para clientes de email que no soproten contenido enriquecido. En ese caso el cliente recae en esta alternativa de sólo texto." - }, - "MAILTASKTEXTVAR" : { - "TITLE" : "Variable del texto", - "DESCRIPTION" : "El nombre de la variable de caso que contiene el texto del contenido del email, en caso de necesitar enviar texto plano (no enriquecido). Puede ser utilizado en combinación con HTML para clientes de email que no soproten contenido enriquecido. En ese caso el cliente recae en esta alternativa de sólo texto." - } - }, - "MAILTASKHTMLPACKAGE": { - "MAILTASKHTML" : { - "TITLE" : "HTML", - "DESCRIPTION" : "Una porción de HTML que se usa como contenido del email." - }, - "MAILTASKHTMLVAR" : { - "TITLE" : "Variable del HTML", - "DESCRIPTION" : "El nombre de la variable de caso que contiene el HTML que se usa como contenido del email." - } - }, - "MAILTASKCHARSETPACKAGE" : { - "MAILTASKCHARSET" : { - "TITLE" : "Juego de caracteres", - "DESCRIPTION" : "Permite cambiar el juego de caracteres del email, que es necesario para los idiomas diferentes al inglés. " - } - }, - "TEXTPACKAGE" : { - "TEXT" : { - "TITLE" : "Texto", - "DESCRIPTION" : "El texto de la anotación" - } - }, - "FORMREFERENCEPACKAGE" : { - "FORMREFERENCE" : { - "TITLE" : "Referencia al formulario", - "DESCRIPTION" : "Referencia a un formulario" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE" : { - "DECISIONTASKDECISIONTABLEREFERENCE" : { - "TITLE" : "Referencia a tabla de decisión", - "DESCRIPTION" : "Establece una referencia a una tabla de decisión" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE" : { - "DECISIONTASKTHROWERRORONNOHITS" : { - "TITLE" : "Arrojar error si no coinciden reglas", - "DESCRIPTION" : "Inidica si debe arrojar error cuando no haya reglas en la tabla de decisión que coincidan y, en consecuencia, no haya resultados." - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE" : { - "DECISIONTASKFALLBACKTODEFAULTTENANT" : { - "TITLE" : "Recaer en el tenant predeterminado", - "DESCRIPTION" : "Buscar definciones de decisión sin tenant cuando fallan los intentos previos para encontrar definiciones con tenant." - } - }, - "HTTPTASKREQUESTMETHODPACKAGE" : { - "HTTPTASKREQUESTMETHOD" : { - "TITLE" : "Método de petición", - "DESCRIPTION" : "Método de petición. Por ejemplo, GET,POST,PUT, etc." - } - }, - "HTTPTASKREQUESTURLPACKAGE" : { - "HTTPTASKREQUESTURL" : { - "TITLE" : "URL de la petición", - "DESCRIPTION" : "URL de la petición. Por ejemplo, http://flowable.org." - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE" : { - "HTTPTASKREQUESTHEADERS" : { - "TITLE" : "Cabeceras de la petición", - "DESCRIPTION" : "Cabecereas HTTP separadas en líneas. Por ejemplo, Content-Type: application/json." - } - }, - "HTTPTASKREQUESTBODYPACKAGE" : { - "HTTPTASKREQUESTBODY" : { - "TITLE" : "Cuerpo de la petición", - "DESCRIPTION" : "Cuerpo de la petición. Por ejemplo, ${sampleBody}." - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE" : { - "HTTPTASKREQUESTBODYENCODING" : { - "TITLE" : "Codificación del cuerpo de la petición", - "DESCRIPTION" : "Codificación del cuerpo de la petición. Por ejemplo, UTF-8." - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE" : { - "HTTPTASKREQUESTTIMEOUT" : { - "TITLE" : "Tiempo de espera de la petición", - "DESCRIPTION" : "Tiempo de espera en milisegundos para la petición. Por ejemplo, 5000." - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE" : { - "HTTPTASKDISALLOWREDIRECTS" : { - "TITLE" : "Rechazar redirecciones", - "DESCRIPTION" : "Determina si se rechazan las redirecciones HTTP." - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE" : { - "HTTPTASKFAILSTATUSCODES" : { - "TITLE" : "Códigos de estado de falla", - "DESCRIPTION" : "Lista separada por comas de los códigos de estado en las respuestas HTTP para reintentos (arroja FlowableException). Por ejemplo, 400,5XX." - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE" : { - "HTTPTASKHANDLESTATUSCODES" : { - "TITLE" : "Códigos de estado de manejo", - "DESCRIPTION" : "Lista separada por comas de los códigos de estado en las respuestas HTTP para ignorar (arroja BPMNError). Por ejemplo, 404,3XX." - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE" : { - "HTTPTASKIGNOREEXCEPTION" : { - "TITLE" : "Ignorar excepciones", - "DESCRIPTION" : "Determina si se ignoran las excepciones" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE" : { - "HTTPTASKRESPONSEVARIABLENAME" : { - "TITLE" : "Nombre de la variable de respuesta", - "DESCRIPTION" : "Define el nombre de la variable para almacenar la respuesta HTTP." - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE" : { - "HTTPTASKSAVEREQUESTVARIABLES" : { - "TITLE" : "Guardar variables de la solicitud", - "DESCRIPTION" : "Determina si se guardan las variables de la solicitud." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERS" : { - "TITLE" : "Guardar estado de respuesta y cabeceras", - "DESCRIPTION" : "Determinan si se guarda el estado de respuesta, cabeceras, etc." - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE" : { - "HTTPTASKRESULTVARIABLEPREFIX" : { - "TITLE" : "Prefijo de la variable de resultado", - "DESCRIPTION" : "Prefijo para los nombres de variables de ejecución." - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT" : { - "TITLE" : "Guardar respuesta como variable transient", - "DESCRIPTION" : "Determina si se debe almacenar las respuesta como variable(s) transient" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE" : { - "HTTPTASKSAVERESPONSEASJSON" : { - "TITLE" : "Guardar respuesta como JSON", - "DESCRIPTION" : "Determina si se guarda la variable de respuesta como JSON en lugar de String" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the case is faster." - } - }, - "EVENTREGISTRYPACKAGE" : { - "EVENTKEY" : { - "TITLE" : "Clave del evento", - "DESCRIPTION" : "Definición del clave de de identificación del evento" - }, - "EVENTNAME" : { - "TITLE" : "Nombre de evento", - "DESCRIPTION" : "Definición del nombre del evento" - }, - "EVENTINPARAMETERS" : { - "TITLE" : "Mapeo hacia carga útil del evento", - "DESCRIPTION" : "Mapeo de las variables del proceso a las propiedades de la carga útil del evento" - }, - "EVENTOUTPARAMETERS" : { - "TITLE" : "Mapeo desde la carga util del evento", - "DESCRIPTION" : "Mapeo de las propiedades de la carga útil del evento a las variables del proceso" - }, - "EVENTCORRELATIONPARAMETERS" : { - "TITLE" : "Parámetros de correlación", - "DESCRIPTION" : "Definición de los parámetros de correlación" - }, - "CHANNELKEY" : { - "TITLE" : "Clave del canal", - "DESCRIPTION" : "Definición del clave de identificación del canal" - }, - "CHANNELNAME" : { - "TITLE" : "Nombre del canal", - "DESCRIPTION" : "Definición del nombre del canal" - }, - "CHANNELTYPE" : { - "TITLE" : "Tipo de canal", - "DESCRIPTION" : "Definición del tipo de canal" - }, - "CHANNELDESTINATION" : { - "TITLE" : "Destino del canal", - "DESCRIPTION" : "Definición del destino del canal" - }, - "KEYDETECTIONFIXEDVALUE" : { - "TITLE" : "Valor fijo de la clavel de evento", - "DESCRIPTION" : "Definición del valor fijo de la clave de identificación de evento" - }, - "KEYDETECTIONJSONFIELD" : { - "TITLE" : "Campo JSON de la clave del evento", - "DESCRIPTION" : "Definición de la detección de la clave de identificación de evento con un campo JSON" - }, - "KEYDETECTIONJSONPOINTER" : { - "TITLE" : "Puntero JSON de la clave del evento", - "DESCRIPTION" : "Definición de la detección de la clave de identificación de evento con la expresión de un puntero JSON" - } - }, - "CASETASKCASEREFERENCEPACKAGE": { - "CASETASKCASEREFERENCE": { - "TITLE": "Referencia del caso", - "DESCRIPTION": "Establecer la referencia del caso" - } - }, - "PROCESSTASKPROCESSREFERENCEPACKAGE": { - "PROCESSTASKPROCESSREFERENCE": { - "TITLE": "Referencia del proceso", - "DESCRIPTION": "Establecer la referencia del proceso" - } - }, - "FALLBACKTODEFAULTTENANTPACKAGE": { - "FALLBACKTODEFAULTTENANT": { - "TITLE" : "Recaer en el tenant predeterminado", - "DESCRIPTION" : "Buscar la definición por clave en el tenant predeterminado cuando falle la búsqueda en el tenant especificado." - } - }, - "PROCESSTASKINPARAMETERSPACKAGE": { - "PROCESSTASKINPARAMETERS": { - "TITLE": "Parámetros de entrada", - "DESCRIPTION": "Definición de los parámetros de entrada" - } - }, - "PROCESSTASKOUTPARAMETERSPACKAGE": { - "PROCESSTASKOUTPARAMETERS": { - "TITLE": "Parámetros de salida", - "DESCRIPTION": "Definición de los parámetros de salida" - } - }, - "IDVARIABLENAMEPACKAGE": { - "IDVARIABLENAME": { - "TITLE": "Variable de Id", - "DESCRIPTION": "Si se establece, el id de la instancia será almacenado en esta variable" - } - }, - "TIMEREXPRESSIONPACKAGE": { - "TIMEREXPRESSION": { - "TITLE": "Expresión de temporizador", - "DESCRIPTION": "Una cadena ISO-8601 o una expresión que resuelva una cadena ISO-8601 o una java.util.Date" - } - }, - "TIMERSTARTTRIGGERPACKAGE": { - "TIMERSTARTTRIGGERSOURCEREF": { - "TITLE": "Item de plan del disparador incial", - "DESCRIPTION": "Una referencia a al ítem del plan para el cual el evento estandar configurado necesita ocurrir al inicio del temporizador (opcional)" - }, - "TRANSITIONEVENT": { - "TITLE": "Evento de transición del disparador inicial", - "DESCRIPTION": "El tipo de evento de transición. Sólo se usa cuando se establece el ítem de plan del disparador inicial" - } - }, - "DECISIONTASKDECISIONREFERENCEPACKAGE": { - "DECISIONTASKDECISIONREFERENCE": { - "TITLE": "Referencia a la decisión", - "DESCRIPTION": "Establecer la referencia a la decisión" - } - }, - "IFPARTCONDITIONPACKAGE": { - "IFPARTCONDITION": { - "TITLE": "Condición", - "DESCRIPTION": "" - } - }, - "TRIGGERMODEPACKAGE": { - "TRIGGERMODE": { - "TITLE": "Modo disparador", - "DESCRIPTION": "Determina si las condiciones centinela son evaluadas con memoria (predeterminado) o sin (on-event). El valor predeterminado significa que se almacenarán las partes de un centinela que se satisfaga. Las evaluaciones posteriores utilizarán las partes almacenadas cuando se reevalúe el centinela. Usando 'on-event', se evalúan todas las partes y, si todas son verdaderas, el centinela queda satisfecho. Si no, todos los resultados se descartan y no se almacenan." - } - }, - "AUTOCOMPLETEPACKAGE": { - "AUTOCOMPLETEENABLED": { - "TITLE": "Autocompletar", - "DESCRIPTION": "Determina si la etapa se completará automáticamente una vez que todos los hijos requeridos estén en un estado finalizado y no haya otros hijos activos." - }, - "AUTOCOMPLETECONDITION": { - "TITLE": "Condición de autocompletar", - "DESCRIPTION": "Una expresión que resuelve si la etapa puede completarase automáticamente." - } - }, - "REQUIREDRULEPACKAGE": { - "REQUIREDENABLED": { - "TITLE": "Requerida", - "DESCRIPTION": "Indica si la etapa, tarea o hito es requerida cuando para la finalización de la etapa padre. De manera predeterminada es false." - }, - "REQUIREDRULECONDITION": { - "TITLE": "Regla requerida", - "DESCRIPTION": "Una expresión que resuelve si la etapa, tarea o hito es requerida para determinar la finalización de la etapa padre." - } - }, - "REPETITIONRULEPACKAGE": { - "REPETITIONENABLED": { - "TITLE": "Repetición", - "DESCRIPTION": "Determina si la repetición está habilitada" - }, - "REPETITIONRULECONDITION": { - "TITLE": "Regla de repetición", - "DESCRIPTION": "Una expresión que se resuelve para determinar si es necesario crear nuevas instancias de ítem de plan" - }, - "REPETITIONCOUNTERVARIABLENAME": { - "TITLE": "Variable de contador de repeticiones", - "DESCRIPTION": "El nombre de la variable local que almacena el contador de instancias de las repeticiones. El valor predeterminado es 'repetitionCounter'." - } - }, - "MANUALACTIVATIONRULEPACKAGE": { - "MANUALACTIVATIONENABLED": { - "TITLE": "Activación manual", - "DESCRIPTION": "Determina si la tarea o etapa necesita ser activada manualmente. De manera predeterminada es false." - }, - "MANUALACTIVATIONRULECONDITION": { - "TITLE": "Regla de activación manual", - "DESCRIPTION": "Una expresión que determina si la tarea o etapa necesita ser activada manualmente." - } - }, - "COMPLETIONNEUTRALRULEPACKAGE": { - "COMPLETIONNEUTRALENABLED": { - "TITLE": "Neutral para compleción", - "DESCRIPTION": "Determina si el ítem del plan es neutral para la compleción. De manera predeterminada es false." - }, - "COMPLETIONNEUTRALRULECONDITION": { - "TITLE": "Regla de neutralidad para la compleción", - "DESCRIPTION": "Una expresión que se resuelve para determinar si el ítem del plan es neutral para la compleción." - } - }, - "PLANITEMLIFECYCLELISTENERSPACKAGE": { - "PLANITEMLIFECYCLELISTENERS": { - "TITLE": "Gestores de eventos del ciclo de vida", - "DESCRIPTION": "Gestores de eventos del ciclo de vida de un ítem del plan" - } - }, - "DISPLAYORDERPACKAGE": { - "DISPLAYORDER": { - "TITLE": "Orden de presentación", - "DESCRIPTION": "Un valor númérico que indica el orden comparado con otras estapas cuando se obtiene o muestra la visión general de etapas." - } - }, - "INCLUDEINSTAGEOVERVIEWPACKAGE": { - "INCLUDEINSTAGEOVERVIEW": { - "TITLE": "Incluir en visión general", - "DESCRIPTION": "Indica si esta etapa debe ser considerada para la visión general" - } - },"MILESTONEVARIABLEPACKAGE" : { - "MILESTONEVARIABLE": { - "TITLE": "Milestone variable", - "DESCRIPTION": "If set, a variable with this name and boolean value true will be created when this milestone is reached" - } - }, - "SCRIPTFORMATPACKAGE": { - "SCRIPTFORMAT": { - "TITLE": "Formato de script", - "DESCRIPTION": "Formato de script de la tarea (JavaScript, groovy, etc)." - } - }, - "SCRIPTTEXTPACKAGE": { - "SCRIPTTEXT": { - "TITLE": "Script", - "DESCRIPTION": "Código fuente del script de la tarea." - } - }, - "TRANSITIONEVENTPACKAGE": { - "TRANSITIONEVENT": { - "TITLE": "Tipo de evento de transición", - "DESCRIPTION": "El tipo de evento de transición" - } - }, - "AVAILABLECONDITIONPACKAGE": { - "AVAILABLECONDITION": { - "TITLE": "Condición de disponibilidad", - "DESCRIPTION": "Una expresión de condición opciónal sobre un gestor de eventos para indicar cuándo se vuelve disponible." - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "Establecer variable resultante como transitoria", - "DESCRIPTION" : "Atributo que establece que el resultado de la expresión no será persistido al finalizar la transacción de base de datos" - } - } - }, - "STENCILS" : { - "GROUPS" : { - "DIAGRAM" : "Diagrama", - "CONTAINERS" : "Contenedores", - "ACTIVITIES" : "Actividades", - "EVENTLISTENERS" : "Gestores de eventos", - "SENTRIES" : "Centinelas", - "CONNECTORS" : "Conectores" - }, - "CMMNDIAGRAM" : { - "TITLE" : "Diagrama CMMN", - "DESCRIPTION" : "Un diagram CMMN 2.0." - }, - "CASEPLANMODEL" : { - "TITLE" : "Modelo del plan del caso", - "DESCRIPTION" : "Un model del plan del caso" - }, - "STAGE" : { - "TITLE" : "Etapa", - "DESCRIPTION" : "Una etapa" - }, - "TASK" : { - "TITLE" : "Tarea", - "DESCRIPTION" : "Una tarea manual" - }, - "HUMANTASK" : { - "TITLE" : "Tarea humana", - "DESCRIPTION" : "Una tarea manual asignada a una persona" - }, - "SERVICETASK" : { - "TITLE" : "Tarea de servicio", - "DESCRIPTION" : "Una tarea automática con una lógica de servicio" - }, - "DECISIONTASK" : { - "TITLE" : "Tarea de decisión", - "DESCRIPTION" : "Una tarea que involucra una decisión DMN" - }, - "HTTPTASK" : { - "TITLE" : "Tarea de HTTP", - "DESCRIPTION" : "Una tarea que usa HTTP" - }, - "MAILTASK" : { - "TITLE" : "Tarea de email", - "DESCRIPTION" : "Una tarea de email" - }, - "SCRIPTTASK" : { - "TITLE" : "Tarea de script", - "DESCRIPTION" : "Una tarea automática con una lógica de script (guión)" - }, - "SENDEVENTTASK" : { - "TITLE" : "Tarea de envío de evento", - "DESCRIPTION" : "Una tarea que envía un evento al registro de eventos" - }, - "MILESTONE" : { - "TITLE" : "Hito", - "DESCRIPTION" : "Un hito" - }, - "CASETASK" : { - "TITLE" : "Tarea de caso", - "DESCRIPTION" : "Una referencia a una definición de caso para crear una nueva instancia" - }, - "PROCESSTASK" : { - "TITLE" : "Tarea de proceso", - "DESCRIPTION" : "Una referencia a una definición de proceso para crear una nueva instancia" - }, - "EVENTLISTENER" : { - "TITLE" : "Gestor de eventos", - "DESCRIPTION" : "Un eventListener genérico" - }, - "TIMEREVENTLISTENER" : { - "TITLE" : "Gestor de eventoss de temporizador", - "DESCRIPTION" : "Un eventlistener con un disparador temporizado" - }, - "USEREVENTLISTENER" : { - "TITLE" : "Gestor de eventos de usuario", - "DESCRIPTION" : "Un gestor de eventos de usuario" - }, - "ENTRYCRITERION" : { - "TITLE" : "Critero de ingreso", - "DESCRIPTION" : "Un centinela que define un criterio de ingreso" - }, - "EXITCRITERION" : { - "TITLE" : "Criterio de salida", - "DESCRIPTION" : "Un centinela que define un criterio de salida" - }, - "ASSOCIATION" : { - "TITLE" : "Asociacion", - "DESCRIPTION" : "Asocia un centinela con un ítem del plan" - } - } - }, - - "EDITOR": { - "POPUP": { - "UNSAVED-CHANGES": { - "TITLE": "Tienes cambios sin guardar", - "DESCRIPTION": "¿Qué deseas realizar con los cambios sin guardar?", - "ACTION": { - "SAVE": "Guardar cambios", - "DISCARD": "Descartar cambios", - "CONTINUE": "Continiar edición" - } - } - } - }, - - "PROCESS-LIST" : { - "TITLE" : "Modelos de procesos de negocio", - "SEARCH-PLACEHOLDER": "Búsqueda", - "ACTION" : { - "CREATE": "Crear Proceso", - "IMPORT": "Importar Proceso" - }, - - "FILTER" : { - "PROCESSES": "Modelo de proceso", - "PROCESSES-COUNT": "Existen {{total}} modelos de proceso", - "PROCESSES-ONE": "Existe un modelo de proceso", - "PROCESSES-EMPTY": "Aún no existe un modelo de proceso creado. Puedes diseñar tus propios modelos, formularios y después incluirlos en una aplicación. El primer paso es crear un modelo de proceso:", - "PROCESSES-BPMN-HINT": "Crear un modelo BPMN usando el editor visual BPMN.", - "PROCESSES-BPMN-IMPORT-HINT": "Tambien puede importar modelos BPMN existentes.", - "FILTER-TEXT": ", coincidentes con \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "No existen modelos de proceso que coincidan con \"{{filterText}}\"", - "RECENT": "Reciente", - "RECENT-COUNT": "{{total}} modelos usados recientemente", - "RECENT-ONE": "Existe un modelo usado recientemente", - "RECENT-EMPTY": "No existen modelos usados recientemente" - }, - - "SORT": { - "MODIFIED-ASC": "Desde el más antiguo", - "MODIFIED-DESC": "Desde el más reciente", - "NAME-ASC": "Nombre, A-Z", - "NAME-DESC": "Nombre, Z-A" - } - }, - - "CASE-LIST" : { - "TITLE" : "Modelos de caso", - "SEARCH-PLACEHOLDER": "Búsqueda", - "ACTION" : { - "CREATE": "Crear caso", - "IMPORT": "Importar caso" - }, - - "FILTER" : { - "CASES": "Modelos de caso", - "CASES-COUNT": "Hay {{total}} modelos de caso", - "CASES-ONE": "Hay un modelo de caso", - "CASES-EMPTY": "Aún no hay modelos de caso creados. Puedes diseñar modelos de caso, formularios de usuario y después incluirlos en definición de aplicaciones. El primer paso es crear un modelo de caso:", - "CASES-CMMN-HINT": "Crear un modelo CMMN usando el editor visual de CMMN.", - "CASES-CMMN-IMPORT-HINT": "También puedes importar modelos CMMN existentes.", - "FILTER-TEXT": ", coincidentes con \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "No hay modelos de caso que coincidan con \"{{filterText}}\"", - "RECENT": "Reciente", - "RECENT-COUNT": "{{total}} modelos usados recientemente", - "RECENT-ONE": "Un modelo usado recientemente", - "RECENT-EMPTY": "No hay modelos usados recientemente" - }, - - "SORT": { - "MODIFIED-ASC": "Desde el más antiguo", - "MODIFIED-DESC": "Desde el más reciente", - "NAME-ASC": "Nombre, A-Z", - "NAME-DESC": "Nombre, Z-A" - } - }, - - "FORMS-LIST" : { - "TITLE" : "Formularios", - "SEARCH-PLACEHOLDER": "Búsqueda", - "ACTION" : { - "CREATE": "Crear formulario", - "CREATE-INLINE": "Crear un nuevo formulario ahora!", - "SHOW-MORE": "Mostrar más..." - }, - - "FILTER" : { - "FORMS": "Formularios", - "FORMS-COUNT": "Existen {{total}} formularios", - "FORMS-ONE": "Existe un formulario", - "FORMS-EMPTY": "No existen formularios. Para agregar uno haz click en Crear formulario.", - "FILTER-TEXT": ", coincidentes con \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "No existe un formulario que coincida con \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "Desde el más antiguo", - "MODIFIED-DESC": "Desde el más reciente", - "NAME-ASC": "Nombre, A-Z", - "NAME-DESC": "Nombre, Z-A" - } - }, - - "DECISIONS-LIST": { - "TITLE": "Tablas de decisión", - "SEARCH-PLACEHOLDER": "Búsqueda", - "ACTION": { - "CREATE": "Crear tabla de decisión", - "IMPORT": "Importar tabla de decisión", - "CREATE-INLINE": "Crear una tabla de decisión ahora!", - "SHOW-MORE": "Mostrar más..." - }, - - "FILTER": { - "DECISION-TABLES": "Tablas de decisión", - "DECISION-TABLES-COUNT": "Existen {{total}} tablas de decisión", - "DECISION-TABLES-ONE": "Existe una tabla de decisión", - "DECISION-TABLES-EMPTY": "No existen tablas de decisión. Para agregar una haz click en Crear tabla de decisión.", - "FILTER-TEXT": ", coincidente con \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "no existen tablas de decisión que coincidan con \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "Desde la más antigua", - "MODIFIED-DESC": "Desde la más reciente", - "NAME-ASC": "Nombre, A-Z", - "NAME-DESC": "Nombre, Z-A" - } - }, - - "APPS-LIST" : { - "TITLE" : "Aplicaciones", - "SEARCH-PLACEHOLDER": "Búsqueda", - "ACTION" : { - "CREATE": "Crear aplicación", - "IMPORT": "Importar aplicación", - "SHOW-MORE": "Mostrar más..." - }, - - "FILTER" : { - "APPS": "Aplicaciones", - "APPS-COUNT": "Existen {{total}} aplicaciones", - "APPS-ONE": "Existe una aplicacion", - "APPS-EMPTY": "No existen aplicaciones. Para agregar una da click en Crear aplicación.", - "FILTER-TEXT": ", concidentes con \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "No existen aplicaciones que coincidan con \"{{filterText}}\"", - - "NO-APPS": "Puedes crear una aplicación publicando un conjunto de Modelos de Proceso.", - "NO-APPS-CALL-TO-ACTION": "Puedes crear una aplicación ahora.", - "NO-APPS-NOTE": "Recuerda publicar cuando estés listo para usar la aplicación." - }, - - "SORT": { - "MODIFIED-ASC": "Desde la más antigua", - "MODIFIED-DESC": "Desde la más reciente", - "NAME-ASC": "Nombre, A-Z", - "NAME-DESC": "Nombre, Z-A" - } - }, - "PROCESS": { - "NAME": "Nombre del modelo", - "KEY": "Clave del modelo", - "DESCRIPTION": "Descripción", - "VERSION-COMMENT": "Comentario de versión", - "ACTION": { - "DETAILS": "Mostrar detalles", - "EDIT": "Modificar propiedades del modelo", - "DUPLICATE": "Duplicar este modelo", - "EXPORT_BPMN20": "Exportar a BPMN 2.0", - "DELETE": "Eliminar este modelo", - "CREATE-CONFIRM": "Crear nuevo modelo", - "DUPLICATE-CONFIRM": "Duplicar el modelo", - "OPEN-IN-EDITOR": "Editor visual", - "EDIT-CONFIRM": "Guardar", - "DELETE-CONFIRM": "Eliminar modelo de proceso", - "USE-AS-NEW-VERSION": "Usar como nueva versión", - "FAVORITE": "Añadir a favoritos" - - }, - "DETAILS": { - "HISTORY-TITLE": "Historial", - "LAST-UPDATED-BY": "Última actualización por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Creado por {{createdBy}}", - "NO-DESCRIPTION": "Este modelo no tiene descripción. Modifica las propiedades del modelo para agregar una." - }, - - "POPUP": { - "CREATE-TITLE": "Crear un nuevo modelo de proceso de negocio", - "DUPLICATE-TITLE": "Duplicar modelo de proceso de negocio", - "CREATE-DESCRIPTION": "Necesitas dar un nombre para el nuevo modelo y es recomendable que también agregues una descripción.", - "DUPLICATE-DESCRIPTION": "Puedes cambiar el nombre del modelo y es recomendable que también cambies la descripción.", - "EDIT-DESCRIPTION": "Cambia cualquier propiedad del modelo y después presiona Guardar para actualizar el modelo.", - "DELETE-DESCRIPTION": "¿Estás seguro que deseas eliminar el modelo de proceso de negocio \"{{name}}\"?", - "EDIT-TITLE":"Editar los detalles del modelo", - "DELETE-TITLE": "Eliminar modelo", - "DELETE-LOADING-RELATIONS": "Verificando el uso del modelo...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "Este modelo no puede ser eliminado porque esta siendo utilizado por otro modelo:", - "DELETE-RELATIONS-DESCRIPTION": "Este modelo no puede ser eliminado porque esta siendo utilizado por otros modelos:", - "DELETE-PROCESS-RELATION": "Modelo de proceso", - "DELETE-FORM-RELATION": "Formulario de modelo", - "DELETE-APP-RELATION": "Modelo de aplicación", - "IMPORT-DESCRIPTION": "Busca o arrastra una definición BPMN XML con la extension .bpmn o .bpmn20.xml", - "IMPORT-TITLE": "Importar un modelo de proceso", - "USE-AS-NEW-TITLE": "Usar como nueva versión", - "USE-AS-NEW-DESCRIPTION": "¿Estas seguro que deseas utilizar la versión {{version}} para crear una nueva versión de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "No se pudo restaurar a la versión seleccionada: algunos modelos no se encuentran debido a que fueron eliminados. Por favor actualiza el modelo de la aplicación. Modelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modelo '{{name}}' con el id {{id}}, creado por {{createdBy}}", - "SHARED-WITH": "Compartido con", - "PERMISSION": "Permiso", - "ACTIONS": "Acciones", - "IMPORT": { - "DROPZONE": "Arrastra un archivo .bpmn o .bpmn20.xml BPMN XML", - "CANCEL-UPLOAD": "Cancelar la carga de archivo", - "ERROR": "Error al procesar el archivo BPMN XML", - "NO-DROP": "Arrastrar y soltar no soportado" - } - }, - "ALERT": { - "EDIT-CONFIRM": "Modelo actualizado" - }, - "ERROR": { - "NOT-FOUND": "El modelo solicitado no existe" - } - }, - - "SUBPROCESS": { - "NAME": "Nombre del subproceso", - "DESCRIPTION": "Descripción", - "ACTION": { - "CREATE-CONFIRM": "Crear nuevo subproceso" - }, - "POPUP": { - "CREATE-TITLE": "Crear nuevo subproceso", - "CREATE-DESCRIPTION": "Necesitas proporcionar un nombre para el nuevo subproceso y también es recomendable agregar una descripción." - } - }, - - "CASE": { - "NAME": "Nombre del modelo", - "KEY": "Clave del modelo", - "DESCRIPTION": "Descripción", - "VERSION-COMMENT": "Comentarios de la versión", - "ACTION": { - "DETAILS": "Mostrar detalles", - "EDIT": "Modificar las propiedadades del modelo", - "DUPLICATE": "Duplicar este modelo", - "EXPORT_CMMN": "Exportar a CMMN 1.1", - "DELETE": "Eliminar este modelo", - "CREATE-CONFIRM": "Crear nuevo modelo", - "DUPLICATE-CONFIRM": "Duplicar el modelo", - "OPEN-IN-EDITOR": "Editor visual", - "EDIT-CONFIRM": "Guardar", - "DELETE-CONFIRM": "Eliminar modelo de caso", - "USE-AS-NEW-VERSION": "Usar como nueva versión", - "FAVORITE": "Añadir a favoritos" - }, - "DETAILS": { - "HISTORY-TITLE": "Historial", - "LAST-UPDATED-BY": "Última actualización por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Creado por {{createdBy}}", - "NO-DESCRIPTION": "Este modelo no tiene descripción. Modifica las propiedades del modelo para agregar una." - }, - - "POPUP": { - "CREATE-TITLE": "Crear un nuevo modelo de caso", - "DUPLICATE-TITLE": "Duplicar el modelo de caso", - "CREATE-DESCRIPTION": "Necesitas proporcionar un nombre para el nuevo modelo y también es recomendable agregar una descripción.", - "DUPLICATE-DESCRIPTION": "Puedes cambiar el nombre del modelo y es recomendable que también cambies la descripción.", - "EDIT-DESCRIPTION": "Cambia cualquier propiedad del modelo y después presiona Guardar para actualizar el modelo.", - "DELETE-DESCRIPTION": "¿Estás seguro que deseas eliminar el modelo \"{{name}}\"?", - "EDIT-TITLE":"Editar los detalles del modelo", - "DELETE-TITLE": "Eliminar modelo", - "DELETE-LOADING-RELATIONS": "Verificando el uso del modelo...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "Este modelo no puede ser eliminado porque esta siendo utilizado por otro modelo:", - "DELETE-RELATIONS-DESCRIPTION": "Este modelo no puede ser eliminado porque esta siendo utilizado por otros modelos:", - "DELETE-PROCESS-RELATION": "Modelo de caso", - "DELETE-FORM-RELATION": "Formulario de modelo", - "DELETE-APP-RELATION": "Modelo de aplicación", - "IMPORT-DESCRIPTION": "Busca o arrastra una definición CMMN XML con la extension .cpmn o .cmmn.xml", - "IMPORT-TITLE": "Importar un modelo de caso", - "USE-AS-NEW-TITLE": "Usar como nueva versión", - "USE-AS-NEW-DESCRIPTION": "¿Estas seguro que deseas utilizar la versión {{version}} para crear una nueva versión de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "No se pudo restaurar a la versión seleccionada: algunos modelos no se encuentran debido a que fueron eliminados. Por favor actualiza el modelo de la aplicación. Modelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modelo '{{name}}' con el id {{id}}, creado por {{createdBy}}", - "SHARED-WITH": "Compartido con", - "PERMISSION": "Permiso", - "ACTIONS": "Acciones", - "IMPORT": { - "DROPZONE": "Arrastra un archivo .cmmn o .cmmn.xml CMMN XML", - "CANCEL-UPLOAD": "Cancelar la carga de archivo", - "ERROR": "Error al procesar el archivo CMMN XML", - "NO-DROP": "Arrastrar y soltar no soportado" - } - }, - "ALERT": { - "EDIT-CONFIRM": "Modelo actualizado" - }, - "ERROR": { - "NOT-FOUND": "El modelo solicitado no existe" - } - }, - - "FORM": { - "NAME": "Nombre del formulario", - "KEY": "Clave del formulario", - "DESCRIPTION": "Descripción", - "ACTION": { - "DETAILS": "Mostrar detalles", - "EDIT": "Modicar propiedades del formulario", - "DELETE": "Eliminar este formulario", - "CREATE-CONFIRM": "Crear nuevo formulario", - "DUPLICATE": "Duplicar este formulario", - "DUPLICATE-CONFIRM": "Duplicar el formulario", - "OPEN-IN-EDITOR": "Editor de formulario", - "EDIT-CONFIRM": "Guardar", - "DELETE-CONFIRM": "Eliminar formulario", - "USE-AS-NEW-VERSION": "Usar como nueva versión" - - }, - "DETAILS": { - "HISTORY-TITLE": "Historial", - "LAST-UPDATED-BY": "Ultima actualizacion por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Creado por {{createdBy}}" - }, - - "POPUP": { - "CREATE-TITLE": "Crear nuevo formulario", - "DUPLICATE-TITLE": "Duplicar formulario", - "CREATE-DESCRIPTION": "Necesitas proporcionar un nombre para el nuevo formulario y también es recomendable agregar una descripción.", - "DUPLICATE-DESCRIPTION": "Necesitas proporcionar un nombre para el nuevo formulario y también es recomendable agregar una descripción.", - "SAVE-FORM-TITLE": "Guardar formulario", - "EDIT-DESCRIPTION": "Cambia cualquiera de las propiedades debajo y después presiona Guardar para actualizar el formulario.", - "DELETE-DESCRIPTION": "Estas seguro de eliminar el formulario \"{{name}}\"?", - "EDIT-TITLE":"Editar detalles de formulario", - "DELETE-TITLE": "Eliminar formulario", - "USE-AS-NEW-TITLE": "Usar como nueva versión", - "USE-AS-NEW-VERSION": "Usar como nueva versión", - "USE-AS-NEW-DESCRIPTION": "¿Estás seguro que quieres utilizar la versión {{version}} para crear una nueva versión de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "No se pudo restaurar completamente a la versión seleccionada: Algunos modelos referenciados fueron eliminados. Por favor actualiza el modelo. Moodelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modelo '{{name}}' con identificador {{id}}, creado por {{createdBy}}" - } - }, - - "DECISION-TABLE": { - "NAME": "Nombre de la tabla de decisión", - "KEY": "Clave de la tabla de decisión", - "DESCRIPTION": "Descripción", - "VERSION-COMMENT": "Comentario de versión", - "HIT-POLICY": "Reglas de aciertos:", - "ACTION": { - "DETAILS": "Mostrar detalles", - "EDIT": "Modificar propiedades del modelo", - "SHARE": "Compartir esta tabla de decisión", - "DELETE": "Eliminar esta tabla de decisión", - "ADD-COMMENT": "+ Agregar comentario", - "CREATE-CONFIRM": "Crear nueva tabla de decisión", - "OPEN-IN-EDITOR": "Editor de tabla de decisión", - "EXPORT": "Exportar tabla de decisión", - "DELETE-CONFIRM": "Eliminar tabla de decisión", - "USE-AS-NEW-VERSION": "Usar como nueva versión", - "FAVORITE": "Añadir a favoritos", - "DUPLICATE": "Duplicar esta tabla de decisión" - }, - "DETAILS": { - "HISTORY-TITLE": "Historial", - "COMMENTS-TITLE": "Comentarios", - "LAST-UPDATED-BY": "Última vez actualizado por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Creado por {{createdBy}}" - }, - "HIT-POLICIES": { - "FIRST": "Primero", - "ANY": "Cualquiera", - "UNIQUE": "Único", - "PRIORITY": "Prioridad", - "RULE ORDER": "Orden de regla", - "OUTPUT ORDER": "Orden de salida", - "COLLECT": "Recolectar" - }, - "COLLECT-OPERATORS": { - "SUM": "Suma", - "MIN": "Mín", - "MAX": "Máx", - "COUNT": "Cuenta" - }, - "POPUP": { - "CREATE-TITLE": "Crear nueva tabla de decisión", - "CREATE-DESCRIPTION": "Es necesario dar un nombre par a la tabla de decisión, también es recomendable proporcionar una descripción.", - "SAVE-DESCRIPTION": "Es necesario proporcionar un nombre y un identificador unico para la tabla de decisión, también es recomendable proporcionar una descripción.", - "DUPLICATE-TITLE": "Duplicar tabla de decisión", - "DUPLICATE-DESCRIPTION": "Puedes dar un nombre a la nueva tabla de decisión, también es recomendable proporcionar una descripción.", - "DELETE-TITLE": "Eliminar tabla de decisión", - "DELETE-DESCRIPTION": "¿Estás seguro que deseas eliminar esta tabla de decisión \"{{name}}\"?", - "SAVE-DECISION-TABLE-TITLE": "Guardar tabla de decisión", - "IMPORT-DESCRIPTION": "Busca o arrastra una definición DMN XML con una extension .dmn o .dmn.xml", - "IMPORT-TITLE": "Importar un modelo DMN", - "IMPORT": { - "DROPZONE": "Arrastra un archivo.dmn o .dmn.xml DMN XML", - "CANCEL-UPLOAD": "Cancelar la carga", - "ERROR": "Error cuando se procesaba el archivo DMN XML", - "NO-DROP": "Arrastrar y soltar no soportado" - }, - "USE-AS-NEW-TITLE": "Usar como nueva versión", - "USE-AS-NEW-VERSION": "Usar como nueva versión", - "USE-AS-NEW-DESCRIPTION": "¿Estás seguro que quieres utilizar la versión {{version}} para crear una nueva versión de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "No se pudo restaurar completamente a la versión seleccionada: algunos modelos referenciados fueron eliminados. Por favor actualiza el modelo. Moodelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modelo '{{name}}' con identificador {{id}}, creado por {{createdBy}}", - "FORCE-DMN-11": "Forzar DMN 1.1" - }, - "ALERT": { - "FAVORITE-CONFIRM": "Esta tabla de decisión es ahora favorita", - "UN-FAVORITE-CONFIRM": "Esta tabla de decisión ya no es favorita" - } - }, - - "APP": { - "NAME": "Nombre de la aplicación", - "KEY": "Clave de la aplicación", - "DESCRIPTION": "Descripción", - "ICON": "Ícono", - "THEME": "Tema", - "GROUPS-ACCESS": "Acceso a grupos, separado por comas", - "USERS-ACCESS": "Acceso a usuarios, separado por comas", - "ACTION": { - "DETAILS": "Mostrar detalles", - "EDIT": "Modificar propiedades de la aplicación", - "DUPLICATE": "Duplicar esta aplicación", - "SHARE": "Compartir esta aplicación", - "DELETE": "Eliminar esta aplicación", - "CREATE-CONFIRM": "Crear nueva aplicación", - "DUPLICATE-CONFIRM": "Duplicar aplicación", - "DELETE-CONFIRM": "Eliminar aplicación", - "USE-AS-NEW-VERSION": "Usar como nueva versión", - "OPEN-IN-EDITOR": "Editor de aplicación", - "PUBLISH": "Publicar", - "PUBLISH-CONFIRM": "Publicar aplicación", - "SELECT-ICON": "Cambiar ícono...", - "SELECT-THEME": "Cambiar tema...", - "EDIT-MODELS": "Editar modelos incluidos", - "EXPORT-ZIP": "Exportar aplicación como archivo zip", - "EXPORT-BAR": "Exportar aplicación como archivo de despliegue bar" - - }, - "DETAILS": { - "TITLE": "Detalles de la aplicación: {{name}}", - "HISTORY-TITLE": "Historial", - "MODELS-TITLE": "Modelos incluidos en la aplicación", - "LAST-UPDATED-BY": "Ultima modificación por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Creada por {{createdBy}}", - "NO-DESCRIPTION": "Esta aplicación no tiene descripción. Modifica las propiedades de la aplicación para agregar una.", - "NO-MODELS-SELECTED": "No hay modelos seleccionados para esta aplicación" - }, - "TITLE": { - "SELECT-ICON": "Seleccionar ícono de la aplicación", - "SELECT-THEME": "Seleccionar tema de la aplicación", - "PREVIEW": "Vista previa" - - }, - "POPUP": { - "CREATE-TITLE": "Crear nueva aplicación", - "DUPLICATE-TITLE": "Duplicar aplicación", - "SAVE-APP-TITLE": "Guardar aplicación", - "SAVE-APP-SAVE-SUCCESS": "Aplicación guardada", - "CREATE-DESCRIPTION": "Necesitas dar un nombre para la nueva aplicación, también es recomendable proporcionar una descripción.", - "DUPLICATE-DESCRIPTION": "Puedes dar un nombre para la nueva aplicación, también es recomendable proporcionar una descripción.", - "PUBLISH-TITLE": "Publicar aplicación", - "PUBLISH-DESCRIPTION": "¿Estás seguro que deseas publicar la aplicación \"{{name}}\"? Esta aplicación sera versionada y actualizada en la aplicación de workflow si ya existe.", - "PUBLISH-FIELD": "¿Publicar? Esta aplicación sera versionada y actualizada en la aplicación de workflow si ya existe.", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT": "Tu modelo de proceso \"{{modelInAppName}}\" tiene el mismo identificador \"{{processDefinitionKey}}\" que el proceso existente desplegado \"{{conflictingModelName}}\" de la aplicación \"{{conflictingAppName}}\". Por favor cambia la identificación del modelo de proceso a algo diferente.", - "PUBLISH-ERROR-PROCESS-ALREADY-USED": "Los siguientes modelos de proceso ya son utilizados en otra aplicación. ¿Esto es correcto?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP": "Aplicación", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS": "Aplicación invalida: se encontraron identificadores de proceso duplicados (cambia la identificación de los procesos que tienen este detalle):", - "DELETE-TITLE": "Eliminar aplicación", - "DELETE-DESCRIPTION": "¿Estás seguro que deseas eliminar la aplicación \"{{name}}\"?", - "DELETE-DESCRIPTION-WITH-RUNTIME": "¿Estás seguro que deseas eliminar la aplicación \"{{name}}\"? Esta aplicación se ha publicado en la vista de aplicaciones si confirmas, el acceso a la aplicación sera removido.", - "DELETE-CASCADE-FALSE": "Eliminar sólo la versión actual de la aplicación (v{{version}})", - "DELETE-CASCADE-TRUE": "Eliminar también las versiones anteriores de esta aplicación", - "HAS-CUSTOM-STENCILITEM" : "El modelo \"{{modelName}}\" usa una plantilla con ítems personalizados. No es posible usar este modelo en una aplicación.", - "HAS-VALIDATIONERROR" : "El modelo \"{{modelName}}\" tiene errores de validación y no puede ser añadido a una aplicación. Abre el modelo en el editor para ver más detalles sobre los errores de validación.", - "IMPORT-DESCRIPTION":"Por favor busca o arrastra una aplicación con una extension .zip", - "IMPORT-TITLE":"Importar una aplicación", - "IMPORT": { - "DROPZONE": "Arrastra un archivo de aplicación .zip", - "CANCEL-UPLOAD": "Cancelar la carga", - "RENEWIDM-IDS": "Renueva los identificadores de grupo y de usuario cuando importes los modelos BPMN. Esto es comunmente requerido cuando importas la aplicación en un ambiente de Flowable diferente. Se intentará ligar los pasos humanos y las tareas de usuario al usuario y grupo de usuarios correctos en este ambiente.", - "ERROR": "Error mientras se procesaba el archivo de la aplicación", - "NO-DROP": "Arrastrar y soltar no soportado" - }, - "INCLUDE-MODELS-TITLE": "Modelos incluidos en la aplicación" - }, - "ALERT": { - "DELETE-CONFIRM": "Aplicación eliminada", - "PUBLISH-CONFIRM": "La aplicación ha sido publicada", - "PUBLISH-ERROR": "No se pude publicar la aplicación. Por favor revisa que los modelos de proceso incluidos sean correctos" - } - }, - - "SHARE-INFO": { - "ACTION": { - "ADD": "Agregar otra persona" - } - }, - - "FORM-BUILDER": { - "PALLETTE": { - "TEXT": "Texto", - "MULTILINE-TEXT": "Texto multilínea", - "PASSWORD": "Contraseña", - "NUMBER": "Número", - "CHECKBOX": "Verificación", - "DATE": "Fecha", - "DROPDOWN": "Lista", - "RADIO": "Opciones", - "PEOPLE": "Personas", - "GROUP-OF-PEOPLE": "Grupo de personas", - "UPLOAD": "Cargar archivo", - "EXPRESSION": "Expresión", - "DECIMAL": "Decimal", - "HYPERLINK": "Hipervínculo", - "SPACER": "Espaciador", - "HORIZONTAL-LINE": "Línea horizontal", - "HEADLINE": "Título", - "HEADLINE-WITH-LINE":"Título" - }, - "TABS": { - "GENERAL": "General", - "OPTIONS": "Opciones", - "UPLOAD-OPTIONS": "Opciones de carga", - "ADVANCED-OPTIONS":"Avanzado" - }, - "VERSION": "Versión {{version}}", - "LAST-UPDATED": "Ultima vez actualizado por {{lastUpdatedBy}}, {{lastUpdated | dateformat}}", - "TITLE": { - "DESIGN": "Diseño", - "OUTCOME": "Resultado" - }, - "POPUP": { - "EDIT-TITLE": "Editar campo '{{name}}'", - "EXPRESSION-TITLE": "Editar expresión" - }, - "MESSAGE": { - "EMPTY-EXPRESSION": "(Sin valor de expresión)", - "EXPRESSION-HELP": "Tambien puedes mostrar valores enviados anteriormente en cualquier formulario como parte del texto. Debes referenciarlos mediante una notación como la siguiente: ${myFieldId}.", - "OPTIONS-EXPRESSION-HELP": "Puede usar una expresión para completar dinámicamente las opciones, por ejemplo, haciendo referencia a una variable como esta: ${optionsVariable}. La expresión debe dar como resultado un objeto java (java.util.List con objetos Option) o su representación json." - }, - "LABEL" : { - "FUNCTIONAL-GROUP": "Selecciona el grupo..", - "PERSON": "Selecciona la persona..." - }, - "COMPONENT": { - "LABEL": "Etiqueta:", - "OVERRIDEID": "¿Sobreescribir identificador?", - "ID": "Identificador:", - "PLACEHOLDER": "Marcador de posición", - "OPTIONS": "Opciones", - "RADIO-BUTTON-DEFAULT": "Opción 1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION": "Por favor elige uno...", - "DROPDOWN-EMPTY-VALUE-HELP": "Esta es la opción 'valor vacio'. Seleccionar esto en tiempo de ejecucion es igual a 'sin valor' o 'vacio'. Esto esta permitido para campos opcionales, pero no para campos requeridos.", - "OPTIONS-EXPRESSION": "Expresión de opciones", - "OPTIONS-EXPRESSION-ENABLED": "Habilitar expresión de opciones", - "REQUIRED": "Requerido", - "READONLY": "Sólo lectura", - "EXPRESSION": "Expresión", - "ADD-OPTION": "+ Agregar nueva opción", - "UPLOAD-ALLOW-MULTIPLE": "Permitir subir varios archivos", - "SIZE": "Tamaño", - "MAX-LENGTH":"Longitud máxima", - "MIN-LENGTH":"Longitud mínima", - "PASSWORD-UNMASK-OPTION": "Opción de enmascaramiento/desenmascaramiento de contraseña", - "HYPERLINK-URL": "URL de enlace", - "REGEX-PATTERN":"Expresión regular", - "MASK":{ - "TITLE":"Máscara de entrada", - "EXAMPLES":{ - "TITLE":"Ejemplos:", - "NUMBER":"Cualquier número", - "LETTER":"Cualquier letra", - "NUMBERORLETTER":"Cualquier letra o número", - "OPTIONAL":"Hacer la máscara opcional (no valida)", - "PHONE":"Teléfono" - } - } - }, - "OUTCOMES": { - "DESCRIPTION": "Puedes definir múltiples resultados para esta tarea. Cuando se esté completando la tarea, el usuario seleccionará uno de los resultados disponibles. Pueden ser utilizados, por ejemplo, en una condición utilizada más adelante en el proceso.", - "NO-OUTCOMES-OPTION": "No utilizar resultados personalizados. Sólo mostrar un botón de 'Completar'.", - "OUTCOMES-OPTION": "Usar resultados personalizados para este formulario.", - "POSSIBLE-OUTCOMES": "Posibles resultados", - "NEW-OUTCOME-PLACEHOLDER": "Introduce un nuevo resultado", - "ADD": "Agregar resultado", - "REMOVE": "Eliminar" - } - }, - - "DECISION-TABLE-EDITOR": { - "EMPTY-MESSAGES": { - "NO-VARIABLE-SELECTED": "Indefinido" - }, - "POPUP": { - "EXPRESSION-EDITOR": { - "INPUT-TITLE": "Editar columna de entrada", - "INPUT-DESCRIPTION": "Seleccionar variable de entrada como entrada para la columna", - "OUTPUT-TITLE": "Editar columna de salida", - "OUTPUT-DESCRIPTION": "Selecionar una variable de salida existente o crear una nueva", - "EXPRESSION-LABEL": "Etiqueta de columna", - "EXPRESSION-PLACEHOLDER": "Ingresar una etiqueta opcional", - "EXPRESSION-VARIABLE-NAME": "Nombre de variable", - "EXPRESSION-VARIABLE-TYPE": "Tipo de variable", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER": "Ingresar nombre de variable", - "OUTPUT-NEW-VARIABLE-ID": "Identificador de variable", - "OUTPUT-NEW-VARIABLE-TYPE": "Tipo de variable", - "COMPLEX-EXPRESSION-LABEL": "Expresión compleja", - "ALLOWED-VALUES": "Valores permitidos (opcional)", - "OUTPUT-VALUES": "Valores de salida ", - "OUTPUT-VALUES-OPTIONAL": "(opcional)", - "OUTPUT-VALUES-NOT-OPTIONAL": "(arrastrar filas para definir prioridad / orden de salida):" - } - }, - "BUTTON-ACTIONS-LABEL": "Acciones", - "BUTTON-ADD-INPUT-LABEL": "Agregar entrada", - "BUTTON-ADD-OUTPUT-LABEL": "Agregar salida", - "BUTTON-ADD-RULE-LABEL": "Agregar regla", - "BUTTON-MOVE-RULE-UPWARDS-LABEL": "Mover arriba", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL": "Mover abajo", - "BUTTON-REMOVE-RULE-LABEL": "Eliminar regla", - "ALERT": { - "EXPRESSION-VARIABLE-REQUIRED-ERROR": "Todas las expresiones de entrada y salida deben referenciar un campo del formulario o una variable.", - "SAVE-CONFIRM": "Guardar tabla de decisión '{{name}}'" - } - }, - - "TOUR": { - "WELCOME-TITLE": "Bienvenido, {{userName}}", - "WELCOME-CONTENT": "Esta es una pequeña guía del Editor Flowable. Los siguientes pasos te guiarán a través de las diferentes secciones de la aplicación. Presiona ESC para detener la guía en cualquier momento." , - "PALETTE-TITLE": "Barra de dibujo", - "PALETTE-CONTENT": "Todos los símbolos necesarios para crear un proceso de negocio se pueden encontrar aquí. Se encuentran agrupados de manera lógica. Para abrir un grupo simplemente da clic en él:", - "CANVAS-TITLE": "El área de trabajo", - "CANVAS-CONTENT": "En este espacio crea tu proceso de negocio. Arrastra elementos desde la barra de dibujo a la izquierda y suéltalos en esta área para empezar a modelar.", - "DRAGDROP-TITLE": "Ejemplo arrastrar y soltar", - "DRAGDROP-CONTENT": "Aquí tienes un ejemplo de cómo comenzar a modelar:", - "PROPERTIES-TITLE": "Propiedades", - "PROPERTIES-CONTENT": "Aquí puedes configurar las propiedades de un proceso de negocios. Simplemente selecciona un elemento en el área de trabajo y sus propiedades se mostrarán. Haz clic en la propiedad si deseas editarla.", - "TOOLBAR-TITLE": "Barra de herramientas", - "TOOLBAR-CONTENT": "Aquí se pueden encontrar todas las acciones: guardar o validar un modelo, copiar y pegar partes del proceso, etc. Pasa sobre los botones para ver lo que realizan.", - "END-TITLE": "Fin", - "END-CONTENT": "Ahora puedes modelar tus procesos. Si tienes alguna duda, sientete libre de preguntar en Flowable Forum." - }, - - "FEATURE-TOUR" : { - "BENDPOINT" : { - "TITLE": "Tutorial punto de curva", - "DESCRIPTION" : "Cuando estás conectando un elemento con otro usando un flujo de secuencia (esas flechas entre los pasos del proceso), encontrarás que esos flujos se entrecruzan o que deseas acomodarlos de una manera diferente. Para hacer esto puedes agregar o eliminar un punto de curva de un flujo de secuencia.
Como se muestra debajo en la figura, primero das click en el boton 'Añadir punto curva' y después das click en el flujo de secuencia al que deseas agregarlo. El flujo de secuencia te indicará con un punto en verde que el punto curva puede ser agregado.
Para eliminar un punto curva, click en 'Eliminar punto curva' y haz click en el flujo de secuencia del cual deseas eliminar." - } - }, - - "ACTION.OK" : "Ok", - "ACTION.SAVE" : "Guardar", - "ACTION.SAVE-AND-CLOSE" : "Guardar y cerrar el editor", - "ACTION.SEND" : "Enviar", - "ACTION.CANCEL" : "Cancelar", - "ACTION.SELECT" : "Seleccionar", - "ACTION.ADD" : "Añadir", - "ACTION.REMOVE" : "Eliminar", - "ACTION.MOVE.UP" : "Mover arriba", - "ACTION.MOVE.DOWN" : "Mover abajo", - - "TOOLBAR.ACTION.CLOSE" : "Cerrar el editor y volver a la página de previsualizacion", - "TOOLBAR.ACTION.SAVE" : "Guardar el modelo", - "TOOLBAR.ACTION.VALIDATE" : "Validar el modelo", - "TOOLBAR.ACTION.CUT" : "Cortar (seleciona uno o más elementos de tu proceso de negocio)", - "TOOLBAR.ACTION.COPY" : "Copiar (seleciona uno o más elementos de tu proceso de negocio)", - "TOOLBAR.ACTION.PASTE" : "Pegar", - "TOOLBAR.ACTION.DELETE" : "Eliminar el elemento seleccionado", - "TOOLBAR.ACTION.UNDO" : "Deshacer", - "TOOLBAR.ACTION.REDO" : "Rehacer", - "TOOLBAR.ACTION.ZOOMIN" : "Acercar", - "TOOLBAR.ACTION.ZOOMOUT" : "Alejar", - "TOOLBAR.ACTION.ZOOMACTUAL" : "Tamaño original", - "TOOLBAR.ACTION.ZOOMFIT" : "Ajustar a la página", - "TOOLBAR.ACTION.BENDPOINT.ADD" : "Añadir punto de curva al flujo de secuencia seleccionado", - "TOOLBAR.ACTION.BENDPOINT.REMOVE" : "Eliminar punto de curva del flujo de secuencia seleccionado", - "TOOLBAR.ACTION.ALIGNHORIZONTAL" : "Alinear modelo horizontalmente", - "TOOLBAR.ACTION.ALIGNVERTICAL" : "Alinear modelo verticalmente", - "TOOLBAR.ACTION.SAMESIZE" : "Mismo tamaño", - "TOOLBAR.ACTION.HELP": "Iniciar la visita guiada", - "TOOLBAR.ACTION.FEEDBACK": "Danos tu opinión", - - "FORM_TOOLBAR.ACTION.SAVE" : "Guardar el modelo", - - "APP_DEFINITION_TOOLBAR.ACTION.SAVE" : "Guardar la aplicación", - - "BUTTON.ACTION.DELETE.TOOLTIP": "Eliminar elemento del modelo", - "BUTTON.ACTION.MORPH.TOOLTIP": "Cambiar tipo del elemento", - - "ELEMENT.AUTHOR" : "Autor", - "ELEMENT.DATE_CREATED" : "Fecha de creación", - - "PROPERTY.REMOVED" : "Eliminado", - "PROPERTY.EMPTY" : "Sin valor", - "PROPERTY.PROPERTY.EDIT.TITLE" : "Cambiar valor por", - - "PROPERTY.FEEDBACK.TITLE" : "Por favor danos tu opinión", - - "PROPERTY.ASSIGNMENT.TITLE" : "Asignación", - "PROPERTY.ASSIGNMENT.TYPE" : "Tipo", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE" : "Almacén de identidad", - "PROPERTY.ASSIGNMENT.TYPE.STATIC" : "Valores fijos", - "PROPERTY.ASSIGNMENT.ASSIGNEE" : "Asignado", - "PROPERTY.ASSIGNMENT.MATCHING" : "Usa ↑ y ↓ para seleccionar y presiona Enter para confirmar o usa el mouse", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER" : "Ingresa una asignación", - "PROPERTY.ASSIGNMENT.EMPTY" : "No hay asignación seleccionada", - "PROPERTY.ASSIGNMENT.NONE" : "Ninguno...", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "Buscar usuario", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "Buscar grupo", - "PROPERTY.ASSIGNMENT.SEARCH": "Buscar: ", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY" : "Asignación {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY" : "{{length}} usuarios candidatos", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS" : "Usuarios candidatos", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY" : "{{length}} grupos candidatos", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS" : "Grupos candidatos", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY": "Usuario {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY": "Usuario {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY": "Campo {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY" : "Iniciador del proceso", - "PROPERTY.ASSIGNMENT.IDM.TYPE" : "Asignación", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS" : "No hay usuarios candidatos seleccionados...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS" : "No hay grupos candidatos seleccionados...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR" : "Asignar al iniciador del proceso", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER" : "Asignar a un solo usuario", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS" : "Usuarios candidatos", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS" : "Grupos candidatos", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE" : "Permitir al iniciador del proceso completar la tarea", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY" : "{{length}} gestores de eventos de ejecucion", - "PROPERTY.EXECUTIONLISTENERS.EMPTY" : "No hay gestores de eventos de ejecucion configurados", - "PROPERTY.EXECUTIONLISTENERS.EVENT" : "Evento", - "PROPERTY.EXECUTIONLISTENERS.CLASS" : "Clase", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER" : "Introduce un nombre de clase", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION" : "Expresión", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER" : "Introduce una expresión", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION" : "Expresión del delegado", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Introduce una expresión del delegado", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED" : "No hay gestores de eventos de ejecución seleccionados", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME" : "Nombre", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER" : "Introduce un nombre", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION" : "Expresión", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Introduce una expresión", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE" : "Valor cadena", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Introduce una cadena", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING" : "Cadena", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER" : "Introduce una cadena", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION" : "Implementación", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY" : "No hay un campo seleccionado", - - "PROPERTY.FIELDS" : "{{length}} campos", - "PROPERTY.FIELDS.EMPTY" : "No hay campos seleccionados", - "PROPERTY.FIELDS.NAME" : "Nombre", - "PROPERTY.FIELDS.NAME.PLACEHOLDER" : "Introduce un nombre", - "PROPERTY.FIELDS.EXPRESSION" : "Expresión", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER" : "Ingresa una expresión", - "PROPERTY.FIELDS.STRINGVALUE" : "Valor de cadena", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER" : "Introduce una cadena", - "PROPERTY.FIELDS.STRING" : "Cadena", - "PROPERTY.FIELDS.STRING.PLACEHOLDER" : "Introduce una cadena", - "PROPERTY.FIELDS.IMPLEMENTATION" : "Implementación", - - "PROPERTY.EXCEPTIONS" : "{{length}} excepciones", - "PROPERTY.EXCEPTIONS.EMPTY" : "No hay excepciones seleccionadas", - "PROPERTY.EXCEPTIONS.CODE" : "Código", - "PROPERTY.EXCEPTIONS.CODE.PLACEHOLDER" : "Ingresar un código", - "PROPERTY.EXCEPTIONS.CLASS" : "Clase", - "PROPERTY.EXCEPTIONS.CLASS.PLACEHOLDER" : "Ingresar una clase", - "PROPERTY.EXCEPTIONS.CHILDREN" : "Incluir excepciones hijas", - - "PROPERTY.DATAPROPERTIES.VALUES" : "{{length}} objetos de datos", - "PROPERTY.DATAPROPERTIES.EMPTY" : "No hay objetos de datos configurados", - "PROPERTY.DATAPROPERTIES.ID" : "Id", - "PROPERTY.DATAPROPERTIES.ID.PLACEHOLDER" : "Ingresar un id", - "PROPERTY.DATAPROPERTIES.NAME" : "Nombre", - "PROPERTY.DATAPROPERTIES.NAME.PLACEHOLDER" : "Ingresar un nombre", - "PROPERTY.DATAPROPERTIES.TYPE" : "Tipo", - "PROPERTY.DATAPROPERTIES.VALUE.PLACEHOLDER" : "Ingrsar un valor (opcional)", - "PROPERTY.DATAPROPERTIES.VALUE" : "Valor predeterminado", - - "PROPERTY.FORMPROPERTIES.VALUE" : "{{length}} propiedades del formulario", - "PROPERTY.FORMPROPERTIES.EMPTY" : "No hay propiedades del formulario seleccionadas", - "PROPERTY.FORMPROPERTIES.ID" : "Identificador", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER" : "Introduce un identificador", - "PROPERTY.FORMPROPERTIES.NAME" : "Nombre", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER" : "Introduce un nombre", - "PROPERTY.FORMPROPERTIES.TYPE" : "Tipo", - "PROPERTY.FORMPROPERTIES.DATEPATTERN" : "Patrón de fecha", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER" : "Introduce un patrón de fecha", - "PROPERTY.FORMPROPERTIES.VALUES" : "Valores", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY" : "No se selecciono un valor enum", - "PROPERTY.FORMPROPERTIES.VALUES.ID" : "Identificador", - "PROPERTY.FORMPROPERTIES.VALUES.NAME" : "Nombre", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER" : "Introduce el identificador del valor", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER" : "Introduce el nombre del valor", - "PROPERTY.FORMPROPERTIES.EXPRESSION" : "Expresión", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER" : "Introduce una expresión", - "PROPERTY.FORMPROPERTIES.VARIABLE" : "Variable", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER" : "Introduce una variable", - "PROPERTY.FORMPROPERTIES.DEFAULT" : "valor predeterminado", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER" : "Introduce un valor predeterminado", - "PROPERTY.FORMPROPERTIES.REQUIRED" : "Requerido", - "PROPERTY.FORMPROPERTIES.READABLE" : "Legible", - "PROPERTY.FORMPROPERTIES.WRITABLE" : "Escribible", - - "PROPERTY.INPARAMETERS.VALUE" : "{{length}} parámetros de entrada", - "PROPERTY.INPARAMETERS.EMPTY" : "No hay parámetros de entrada configurados", - - "PROPERTY.OUTPARAMETERS.VALUE" : "{{length}} parámetros de salida", - "PROPERTY.OUTPARAMETERS.EMPTY" : "No hay parámetros de salida configurados", - - "PROPERTY.PARAMETER.SOURCE" : "Fuente", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER" : "Introduce una fuente", - "PROPERTY.PARAMETER.SOURCEEXPRESSION" : "Expresión de fuente", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER" : "Expresión de fuente", - "PROPERTY.PARAMETER.TARGET" : "Objetivo", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER" : "Introduce un objetivo", - "PROPERTY.PARAMETER.TARGETEXPRESSION" : "Expresión de objetivo", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER" : "Introduce un expresión de objetivo", - "PROPERTY.PARAMETER.EMPTY" : "No hay parámetro seleccionado", - - "PROPERTY.PROCESSREFERENCE.EMPTY" : "No hay referencia seleccionada", - "PROPERTY.PROCESSREFERENCE.TITLE" : "Referencia a proceso", - "PROPERTY.PROCESSREFERENCE.ERROR.PROCESS" : "Ocurrió un error cargando los procesos. Intenta más tarde", - "PROPERTY.PROCESSREFERENCE.PROCESS.LOADING" : "Cargando procesos...", - "PROPERTY.PROCESSREFERENCE.PROCESS.EMPTY" : "Esta carpeta no contiene procesos", - - "PROPERTY.FORMREFERENCE.EMPTY" : "No hay referencia seleccionada", - "PROPERTY.FORMREFERENCE.TITLE" : "Referencia a formulario", - "PROPERTY.FORMREFERENCE.DESCRIPTION" : "Referencia a formulario", - "PROPERTY.FORMREFERENCE.ERROR.FORM" : "Ocurrió un error cargando los formularios. Intenta mas tarde", - "PROPERTY.FORMREFERENCE.FORM.LOADING" : "Cargando formularios...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY" : "Esta carpeta no contiene formularios", - - "PROPERTY.TASKLISTENERS.VALUE" : "{{length}} gestores de eventos de tarea", - "PROPERTY.TASKLISTENERS.EMPTY" : "No hay gestores de eventos de tarea configurados", - "PROPERTY.TASKLISTENERS.EVENT" : "Evento", - "PROPERTY.TASKLISTENERS.CLASS" : "Clase", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER" : "Introduce un nombre de clase", - "PROPERTY.TASKLISTENERS.EXPRESSION" : "Expresión", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER" : "Introduce una expresión", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION" : "Expresión de delegado", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Introduce una expresión del delegado", - "PROPERTY.TASKLISTENERS.UNSELECTED" : "No hay gestores de eventos de tarea seleccionados", - "PROPERTY.TASKLISTENERS.FIELDS.NAME" : "Nombre", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER" : "Introduce un nombre", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION" : "Expresión", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Introduce una expresión", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE" : "Valor de cadena", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Introduce una cadena", - "PROPERTY.TASKLISTENERS.FIELDS.STRING" : "Cadena", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER" : "Introduce una cadena", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION" : "Implementación", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY" : "No hay campo seleccionado", - - "PROPERTY.EVENTLISTENERS.DISPLAY" : "{{length}} gestores de evento", - "PROPERTY.EVENTLISTENERS.EMPTY" : "No hay gestores de evento seleecionados", - "PROPERTY.EVENTLISTENERS.EVENTS": "Eventos", - "PROPERTY.EVENTLISTENERS.RETHROW": "¿Relanzar evento?", - "PROPERTY.EVENTLISTENERS.CLASS" : "Clase", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER" : "Introduce un nombre de clase", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION" : "Expresión de delegado", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Introduce una expresión del delegado", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE" : "Tipo de entidad", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER" : "Introduce un tipo de entidad", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE": "Relanzar tipo de evento", - "PROPERTY.EVENTLISTENERS.ERRORCODE" : "Codigo de error", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER" : "Introduce un código de error", - "PROPERTY.EVENTLISTENERS.MESSAGENAME" : "Nombre de mensaje", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER" : "Introduce un nombre de mensaje", - "PROPERTY.EVENTLISTENERS.SIGNALNAME" : "Nombre de señal", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER" : "Introduce un nombre de señal", - "PROPERTY.EVENTLISTENERS.UNSELECTED" : "No hay gestores de evento seleccionado", - - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE" : "{{length}} gestores de eventos de ciclo de vida", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY" : "No hay gestores de eventos de ciclo de vida configurados", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT" : "Evento", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE" : "Estado de origen", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE" : "Estado de destino", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS" : "Clase", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER" : "Ingresa un nombre de clase", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION" : "Expresión", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER" : "Ingresa una expresión", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION" : "Expresión del delegado", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Introduce una expresión del delegado", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED" : "No hay gestor de eventos de tarea seleccionado", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME" : "Nombre", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER" : "Ingresa un nombre", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION" : "Expresión", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Ingresa una expresión", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE" : "Valor de cadena", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Ingresa un valor de cadena", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING" : "CAdena", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER" : "Ingresa una cadena", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION" : "Implementación", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY" : "No hay campos selecionados", - - "PROPERTY.SIGNALDEFINITIONS.DISPLAY" : "{{length}} definiciones de señal", - "PROPERTY.SIGNALDEFINITIONS.EMPTY" : "No hay definiciones de señal", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL": "Global", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE": "Instancia de proceso", - "PROPERTY.SIGNALDEFINITIONS.ID" : "Identificador", - "PROPERTY.SIGNALDEFINITIONS.NAME" : "Nombre", - "PROPERTY.SIGNALDEFINITIONS.SCOPE" : "Ámbito", - - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY" : "{{length}} definiciones de mensaje", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY" : "No hay definiciones de mensaje configuradas", - "PROPERTY.MESSAGEDEFINITIONS.ID" : "Identificador", - "PROPERTY.MESSAGEDEFINITIONS.NAME" : "Nombre", - - "PROPERTY.ESCALATIONDEFINITIONS.DISPLAY" : "{{length}} definiciones de escalamiento", - "PROPERTY.ESCALATIONDEFINITIONS.EMPTY" : "No hay definiciones de escalamiento configuradas", - "PROPERTY.ESCALATIONDEFINITIONS.ID" : "Id", - "PROPERTY.ESCALATIONDEFINITIONS.NAME" : "Nombre", - - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY" : "No se definió el orden de los flujos de secuencia", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY" : "Orden de flujos de secuencia establecido", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND" : "No se encontro un flujo de secuencia de salida.", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION" : "Establecer el orden en el cual el flujo de secuencia necesita ser evaluado:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE" : "Flujo de secuencia a {{targetType}} {{targetTitle}}", - - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE" : "Condición del flujo de secuencia", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC" : "Expresión de la condición", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY": "No hay condición fijada", - - "PROPERTY.DUEDATE.EMPTY" : "No se definió fecha de vencimiento", - "PROPERTY.DUEDATE.DEFINED" : "Se definió fecha de vencimiento", - "PROPERTY.DUEDATE.TITLE" : "Fecha de vencimiento", - "PROPERTY.DUEDATE.EXPRESSION-LABEL" : "Expresión de fecha de vencimiento", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE" : "No hay fecha de vencimiento", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION" : "Definición de expresión", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC" : "Duración arreglada después de la creación de la tarea", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD" : "Basado en un campo", - - "PROPERTY.EVENTINPARAMETERS.VALUE" : "{{length}} parámetros de eventos de entrada", - "PROPERTY.EVENTINPARAMETERS.EMPTY" : "No hay parámetro de entrada configurado", - - "PROPERTY.EVENTINPARAMETERS.EVENTNAME" : "Nombre de la propiedad del evento", - "PROPERTY.EVENTINPARAMETERS.EVENTNAME.PLACEHOLDER" : "Ingrese el nombre de la propiedad del evento", - "PROPERTY.EVENTINPARAMETERS.EVENTTYPE" : "Tipo", - "PROPERTY.EVENTINPARAMETERS.VARIABLENAME" : "Nombre de variable", - "PROPERTY.EVENTINPARAMETERS.VARIABLENAME.PLACEHOLDER" : "Ingrese un nombre de variable", - "PROPERTY.EVENTINPARAMETERS.NOSELECTION" : "No hay un parámetro seleccionado", - - "PROPERTY.EVENTOUTPARAMETERS.VALUE" : "{{length}} parámetros de eventos de salida", - "PROPERTY.EVENTOUTPARAMETERS.EMPTY" : "No hay parámetro de salida configurado", - - "PROPERTY.EVENTOUTPARAMETERS.EVENTNAME" : "Nomre de la propiedad del evento", - "PROPERTY.EVENTOUTPARAMETERS.EVENTNAME.PLACEHOLDER" : "Ingrese el nombre de la propiedad del evento", - "PROPERTY.EVENTOUTPARAMETERS.EVENTTYPE" : "Tipo", - "PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME" : "Nombre de variable", - "PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME.PLACEHOLDER" : "Ingrese un nombre de variable", - "PROPERTY.EVENTOUTPARAMETERS.NOSELECTION" : "No hay un parámetro seleccionado", - - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUE" : "{{length}} parámetros de correlación", - "PROPERTY.EVENTCORRELATIONPARAMETERS.EMPTY" : "No hay parámetro de correlación configurado", - - "PROPERTY.EVENTCORRELATIONPARAMETERS.NAME" : "Nombre", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NAME.PLACEHOLDER" : "Ingrese un nombre", - "PROPERTY.EVENTCORRELATIONPARAMETERS.TYPE" : "Tipo", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NOSELECTION" : "No hay parámetro seleccionado", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUEPROP" : "Valor", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUEPROP.PLACEHOLDER" : "Ingrese un valor o expresión", - - "MODEL.SAVE.TITLE" : "Guardar modelo", - "MODEL.VALIDATE.TITLE" : "Resultados de validación", - "MODEL.NAME" : "Nombre", - "MODEL.KEY" : "Clave", - "MODEL.DESCRIPTION" : "Descripción", - "MODEL.SAVE.NEWVERSION" : "¿Guardar como nueva versión? Esto significa que siempre podras volver a una versión anterior", - "MODEL.SAVE.COMMENT" : "Comentario", - "MODEL.SAVE.SAVING" : "Guardando modelo", - "MODEL.LASTMODIFIEDDATE" : "Último guardado", - "MODEL.SAVE.ERROR": "Error inesperado: no se pudo guardar el modelo", - "MODEL.VALIDATIONERRORS": "El modelo tiene errores de validación. El modelo no puede desplegarse al Flowable Engine en el estado actual.", - "MODEL.CONFLICT.WRITE": "No se puede guardar el modelo: '{{userFullName}}'. Ha echo cambios a este modelo.", - "MODEL.CONFLICT.WRITE.OPTIONS": "Selecciona una opción para solucionar esto:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE": "Sobreescribir el otro modelo", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES": "Descartar mis cambios", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS": "Guardar como nuevo modelo", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION": "Crear una nueva versión", - "MODEL.CONFLICT.SAVEAS" : "Guardar como:", - - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP": "Una actividad está a punto de ser ejecutada como compensación para otra actividad. El evento apunta a la actividad que está a punto de ser ejecutada para la compensación.", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP": "Una actividad se ha completado exitosamente.", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP": "Una actividad ha recibido un mensaje de error. Enviado antes que el error en sí haya sido recibido por la actividad.", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP": "Una nueva membresía ha sido creada", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP": "Una sola membresía ha sido eliminada", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP": "Todas las membresías relacionadas a un grupo han sido eliminadas. No se enviarán eventos individuales debido a razones de desempeño.", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP": "Una tarea se ha asignado. Se lanzó junto al evento ENTITY_UPDATED", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP": "Una tarea ha sido completada. Enviado antes que la entidad de la tarea sea eliminada.", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP": "Cuando un error BPMN fue lanzado, pero no fue capturado dentro del proceso", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP": "Una nueva variable se creó", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP": "Una variable existente fue eliminada", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP": "Una variable existente fue actualizada", - - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY" : "No hay referencia selecionada", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE" : "Referencia a la tabla de decisión", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM" : "Ocurrió un error cargando la tabla de decisiones. Intenta más tarde.", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING" : "Cargando tabla de decisiones...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY" : "Esta carpeta no contiene tablas de decisiones", - - "PROPERTY.CASEREFERENCE.EMPTY" : "No hay referencia seleccionda", - "PROPERTY.CASEREFERENCE.TITLE" : "Referencia al modelo de casos", - "PROPERTY.CASEREFERENCE.ERROR.FORM" : "Ocurrió un error cargando los modelos de caso. Intenta más tarde.", - "PROPERTY.CASEREFERENCE.CASE.LOADING" : "Cargando modelos de caso...", - "PROPERTY.CASEREFERENCE.CASE.EMPTY" : "Esta carpeta no contiene modelos de caso" -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/fr.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/fr.json deleted file mode 100644 index ca1795ca..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/fr.json +++ /dev/null @@ -1,1009 +0,0 @@ -{ - "GENERAL" : { - "MAIN-TITLE": "Flowable Editeur", - "NAVIGATION" : { - "PROCESSES": "Processus", - "CASEMODELS": "Modèle de cas", - "FORMS": "Formulaires", - "DECISION-TABLES": "Tables de décision", - "APPS": "Apps" - }, - "TITLE": { - "SELECT-GROUP" :"Sélectionner un groupe", - "MATCHING-GROUPS": "Groupes correspondants", - "FILTER": "Filtre", - "HISTORY": "Historique" - }, - "ACTION": { - "LOGOUT": "Déconnexion", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST": "Afficher toutes les définitions", - "CANCEL": "Annuler", - "CLOSE": "Fermer", - "EDIT": "Editer", - "SAVE": "Sauver", - "OPEN": "Ouvrir", - "OK": "Ok", - "CONFIRM": "Confirmer", - "CONFIRM-AND-CLOSE": "Confirmer et fermer", - "NEW-FORM": "Nouveau formulaire", - "CREATE-FORM": "Créer un formulaire", - "NEW-DECISION-TABLE": "Nouvelle table de décision", - "CREATE-DECISION-TABLE": "Créer une table de décision" - }, - "MESSAGE": { - "SELECT-GROUP-HELP": "Utiliser ↑ et ↓ pour sélectionner et appuyer sur entrée pour confirmer ", - "PEOPLE-NO-MATCHING-RESULTS": "Aucun utilisateur correspondant n'a été trouvé", - "GROUP-NO-MATCHING-RESULTS": "Aucun groupe correspondant n'a été trouvé", - "GROUP-SOURCE-TYPE": "Groupe source", - "GROUP-SOURCE-SEARCH-OPTION": "Recherche de Groupe", - "GROUP-SOURCE-FIELD-OPTION": "Champ de formulaire" - } - }, - - "EDITOR": { - "POPUP": { - "UNSAVED-CHANGES": { - "TITLE": "Vous avez des modifications non enregistrées ", - "DESCRIPTION": "Que voulez vous faire des modifications non sauvegardées ?", - "ACTION": { - "SAVE": "Sauver", - "DISCARD": "Ignorer les changements", - "CONTINUE": "Continuer à éditer" - } - } - } - }, - - "PROCESS-LIST" : { - "TITLE" : "Modèles de processus métiers", - "SEARCH-PLACEHOLDER": "Rechercher", - "ACTION" : { - "CREATE": "Créer un processus", - "IMPORT": "Importer un processus" - }, - - "FILTER" : { - "PROCESSES": "Modèles de processus", - "PROCESSES-COUNT": "Il y a {{total}} modèles de processus", - "PROCESSES-ONE": "Il y a un modèle de processus", - "PROCESSES-EMPTY": "Il n'y a pas de modèle de processus encore créé. Vous pouvez créer des modèles de processus, des formulaires et les grouper au sein d'une application. La première étpage consiste à créer ce modèle de processus:", - "PROCESSES-BPMN-HINT": "Créer un modèle BPMN en utilisant l'Editeur visuel BPMN.", - "PROCESSES-BPMN-IMPORT-HINT": "Vous pouvez aussi importer des modèles BPMN existants.", - "FILTER-TEXT": ", correspondant à \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "Il n'y a pas de modèles de processus correspondant à \"{{filterText}}\"", - "RECENT": "Récent", - "RECENT-COUNT": "{{total}} modèles récemment utilisés", - "RECENT-ONE": "Un modèle récemment utilisé", - "RECENT-EMPTY": "Aucun modèle récemment utilisé" - }, - - "SORT": { - "MODIFIED-ASC": "Du plus vieux", - "MODIFIED-DESC": "Dernières modifications", - "NAME-ASC": "Nom, A-Z", - "NAME-DESC": "Nom, Z-A" - } - }, - - "CASE-LIST" : { - "TITLE" : "Modèles de Cas", - "SEARCH-PLACEHOLDER": "Recherche", - "ACTION" : { - "CREATE": "Créer un Cas", - "IMPORT": "Importer un Cas" - }, - - "FILTER" : { - "CASES": "Modèles de Cas", - "CASES-COUNT": "Il y a {{total}} modèles de Cas", - "CASES-ONE": "Il y a un modèle de Cas", - "CASES-EMPTY": "Aucun modèle de cas n'a encore été créé. Vous pouvez créer un modèle de cas, des formulaires et les grouper au sein d'une définition d'App. La première étape consiste à créer ce modèle de Cas:", - "CASES-CMMN-HINT": "Créer un modèle CMMN en utilisant l'éditeur visuel CMMN.", - "CASES-CMMN-IMPORT-HINT": "Vous pouvez aussi importer un modèle CMMN existant.", - "FILTER-TEXT": ", correspondant à \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "Il n'y a pas de modèle de cas correspondant à \"{{filterText}}\"", - "RECENT": "Récent", - "RECENT-COUNT": "{{total}}modèles récemment utilisés", - "RECENT-ONE": "Un modèle récemment utilisé", - "RECENT-EMPTY": "Aucun modèle récemment utilisé" - }, - - "SORT": { - "MODIFIED-ASC": "Du plus vieux", - "MODIFIED-DESC": "Dernières modifications", - "NAME-ASC": "Nom, A-Z", - "NAME-DESC": "Nom, Z-A" - } - }, - - "FORMS-LIST" : { - "TITLE" : "Formulaires", - "SEARCH-PLACEHOLDER": "Recherche", - "ACTION" : { - "CREATE": "Créer un formulaire", - "CREATE-INLINE": "Créer un nouveau formulaire maintenant!", - "SHOW-MORE": "Voir plus..." - }, - - "FILTER" : { - "FORMS": "Formulaires", - "FORMS-COUNT": "Il y a {{total}} formulaires", - "FORMS-ONE": "Il y a un formulaire", - "FORMS-EMPTY": "Il n'y a pas formulaires. Pour en ajouter un, cliquer sur Créer formulaire.", - "FILTER-TEXT": ", correspondant \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "Il n'y a pas de formulaires correspondant à \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "Du plus vieux", - "MODIFIED-DESC": "Dernières modifications", - "NAME-ASC": "Nom, A-Z", - "NAME-DESC": "Nom, Z-A" - } - }, - - "DECISIONS-LIST": { - "TITLE": "Tables de décision", - "SEARCH-PLACEHOLDER": "Recherche", - "ACTION": { - "CREATE": "Créer une table de décision", - "IMPORT": "Importer une table de décision", - "CREATE-INLINE": "Créer une nouvelle table de décision maintenant!", - "SHOW-MORE": "Voir plus..." - }, - - "FILTER": { - "DECISION-TABLES": "Table de décisions", - "DECISION-TABLES-COUNT": "Il y a {{total}} tables de décision", - "DECISION-TABLES-ONE": "Il y a une table de décision", - "DECISION-TABLES-EMPTY": "Il n'y a pas de table de décisions. Pour en ajouter une, cliquer sur Créer une table de décision.", - "FILTER-TEXT": ", correspondant \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "Il n'y a pas de table de décision correpondants à \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "Du plus vieux", - "MODIFIED-DESC": "Dernières modifications", - "NAME-ASC": "Nom, A-Z", - "NAME-DESC": "Nom, Z-A" - } - }, - - "APPS-LIST" : { - "TITLE" : "Définitions d'App", - "SEARCH-PLACEHOLDER": "Recherche", - "ACTION" : { - "CREATE": "Créer une App", - "IMPORT": "Importer une App", - "SHOW-MORE": "Voir plus..." - }, - - "FILTER" : { - "APPS": "Définitions d'App", - "APPS-COUNT": "Il y a {{total}} définitions d'App", - "APPS-ONE": "Il y a une définition d'App", - "APPS-EMPTY": "Il n'y a pas de définitions d'App. Pour en ajouter une, cliquer sur Créer une Définition d'App .", - "FILTER-TEXT": ", correspondant à \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "Il n'y a pas de définitions d'App correpondant à \"{{filterText}}\"", - - "NO-APPS": "Vous pouvez créer une définition d'App en publiant un paquet de modèles de processus.", - "NO-APPS-CALL-TO-ACTION": "Vous pouvez créer une définition d'App maintenant.", - "NO-APPS-NOTE": "N'oubliez pas de Publier quand vous êtes prêt à l'utiliser." - }, - - "SORT": { - "MODIFIED-ASC": "Du plus vieux", - "MODIFIED-DESC": "Dernières modifications", - "NAME-ASC": "Nom, A-Z", - "NAME-DESC": "Nom, Z-A" - } - }, - "PROCESS": { - "NAME": "Nom du Modèle", - "KEY": "Clé du Modèle", - "DESCRIPTION": "Description", - "VERSION-COMMENT": "Commentaire de version", - "ACTION": { - "DETAILS": "Voir les détails", - "EDIT": "Modifier les propriétés du modèle", - "DUPLICATE": "Dupliquer le modèle", - "EXPORT_BPMN20": "Exporter en BPMN 2.0", - "DELETE": "Supprimer le modèle", - "CREATE-CONFIRM": "Créer un nouveau modèle", - "DUPLICATE-CONFIRM": "Dupliquer le modèle", - "OPEN-IN-EDITOR": "Editeur Visuel", - "EDIT-CONFIRM": "Sauvegarder", - "DELETE-CONFIRM": "Supprimer le modèle de processus", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version", - "FAVORITE": "Mettre en favori ce modèle" - - }, - "DETAILS": { - "HISTORY-TITLE": "Historique", - "LAST-UPDATED-BY": "Dernière modification par {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Créé par {{createdBy}}", - "NO-DESCRIPTION": "Ce modèle n'a pas de description. Modifier les propriétés du modèle pour en ajouter un." - }, - - "POPUP": { - "CREATE-TITLE": "Créer un nouveau modèle de processus métier", - "DUPLICATE-TITLE": "Dupliquer un modèle de processus métier", - "CREATE-DESCRIPTION": "Vous devez donner un nom à ce modèle et en même temps vous devriez en profiter pour ajouter une description. ", - "DUPLICATE-DESCRIPTION": "Vous pouvez changer le nom du nouveau modèle et en même temps vous devriez en profiter pour ajouter une description.", - "EDIT-DESCRIPTION": "Modifier les propriétés ci-dessous et ensuite appuyer sur Sauvegarder pour mettre à jour le modèle.", - "DELETE-DESCRIPTION": "Êtes-vous sûr de vouloir supprimer le modèle de processus \"{{name}}\"?", - "EDIT-TITLE":"Modifier les détails du modèle", - "DELETE-TITLE": "Supprimer le modèle", - "DELETE-LOADING-RELATIONS": "Vérification des usages du modèle...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "Ce modèle ne peut être supprimé car un autre modèle l'utilise:", - "DELETE-RELATIONS-DESCRIPTION": "Ce modèle ne peut être supprimé car il est utilisé par d'autres modèles:", - "DELETE-PROCESS-RELATION": "Modèle de processus", - "DELETE-FORM-RELATION": "Modèle de formulaire", - "DELETE-APP-RELATION": "Modèle d'App", - "IMPORT-DESCRIPTION": "Veuillez naviguer vers ou déposer un fichier de défnition BPMN XML avec une extension en .bpmn ou .bpmn20.xml", - "IMPORT-TITLE": "Importer un modèle de processus", - "USE-AS-NEW-TITLE": "Utiliser en tant que nouvelle version", - "USE-AS-NEW-DESCRIPTION": "Êtes-vous sûr de vouloir utiliser la version {{version}} pour créer une nouvelle version de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Impossibilité de restaurer le modèle d'App dans la version choisie: certains modèles référencés sont manquants car précédemment supprimés. Veuillez mettre à jour votre modèle d'App en conséquence. Modèles manquants:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modèle '{{name}}' avec un identifiant interne {{id}}, créé par {{createdBy}}", - "SHARED-WITH": "Partagé avec", - "PERMISSION": "Permission", - "ACTIONS": "Actions", - "IMPORT": { - "DROPZONE": "Déposer un fichier BPMN avec une extension en .bpmn ou .bpmn20.xml", - "CANCEL-UPLOAD": "Annuler l'envoi", - "ERROR": "Une erreur s'est produite lors du traitement du fichier BPMN XML", - "NO-DROP": "Glisser/déposer n'est pas supporté" - } - }, - "ALERT": { - "EDIT-CONFIRM": "Modèle mise à jour" - }, - "ERROR": { - "NOT-FOUND": "Le modèle demandé n'existe pas." - } - }, - - "SUBPROCESS": { - "NAME": "Nom du sous-processus", - "DESCRIPTION": "Description", - "ACTION": { - "CREATE-CONFIRM": "Créer un nouveau sous-processus" - }, - "POPUP": { - "CREATE-TITLE": "Créer un nouveau sous-processus", - "CREATE-DESCRIPTION": "Vous devez donner un nom au nouveau sous-processus et en même temps vous devriez ajouter une description." - } - }, - - "CASE": { - "NAME": "Nom du Modèle", - "KEY": "Clé du Modèle", - "DESCRIPTION": "Description", - "VERSION-COMMENT": "Commentaire de Version", - "ACTION": { - "DETAILS": "Voir les détails", - "EDIT": "Modifier les propriétés du modèle", - "DUPLICATE": "Dupliquer ce modèle", - "EXPORT_CMMN": "Exporter en CMMN 1.1", - "DELETE": "Supprimer ce modèle", - "CREATE-CONFIRM": "Créer un nouveau modèle", - "DUPLICATE-CONFIRM": "Dupliquer ce modèle", - "OPEN-IN-EDITOR": "Editeur Visuel", - "EDIT-CONFIRM": "Sauvegarder", - "DELETE-CONFIRM": "Supprimer ce modèle de Cas ", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version", - "FAVORITE": "Mettre en favori ce modèle" - - }, - "DETAILS": { - "HISTORY-TITLE": "Historique", - "LAST-UPDATED-BY": "Dernière modification par {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Created by {{createdBy}}", - "NO-DESCRIPTION": "Ce modèle n'a pas de description. Modifier les propriétés du modèle pour en ajouter un." - }, - - "POPUP": { - "CREATE-TITLE": "Créer un nouveau modèle de Cas ", - "DUPLICATE-TITLE": "Dupliquer le modèle de Cas ", - "CREATE-DESCRIPTION": "Vous devez donner un nom au nouveau modèle et en même temps vous devriez ajouter une description.", - "DUPLICATE-DESCRIPTION": "Vous pouvez changer le nom du nouveau modèle et en même temps vous devriez en profiter pour ajouter une description.", - "EDIT-DESCRIPTION": "Modifier les propriétés ci-dessous du modèle et appuyez sur Sauvegarder pour mettre à jour le modèle.", - "DELETE-DESCRIPTION": "Êtes-vous sûr de want to supprimer the modèle de processus \"{{name}}\"?", - "EDIT-TITLE":"Edit modèle details", - "DELETE-TITLE": "Supprimer modèle", - "DELETE-LOADING-RELATIONS": "Checking modèle usage...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "This modèle cannot be deleted, because another modèle is using it:", - "DELETE-RELATIONS-DESCRIPTION": "This modèle cannot be deleted, because it is used by other models:", - "DELETE-PROCESS-RELATION": "Cas modèle", - "DELETE-FORM-RELATION": "formulaire modèle", - "DELETE-APP-RELATION": "App modèle", - "IMPORT-DESCRIPTION": "Please browse for or drop a CMMN XML definition with an .cmmn or .cmmn.xml extension", - "IMPORT-TITLE": "Import a Cas modèle", - "USE-AS-NEW-TITLE": "Use as new version", - "USE-AS-NEW-DESCRIPTION": "Êtes-vous sûr de vouloir utiliser la version {{version}} afin de créer une nouvelle version de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Impossibilité de restaurer le modèle à la version choisie: certains modèles référencés sont manquants car précédemment supprimés. Veuillez mettre à jour votre modèle d'App en conséquence. Modèles manquants:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modèle '{{name}}' avec l'identifiant interne {{id}}, créé par {{createdBy}}", - "SHARED-WITH": "Partagé avec", - "PERMISSION": "Permission", - "ACTIONS": "Actions", - "IMPORT": { - "DROPZONE": "Déposer un fichier CMMN XML avec une extension .cmmn ou .cmmn.xml ", - "CANCEL-UPLOAD": "Annuler l'envoi", - "ERROR": "Erreur durant le traitement du fichier CMMN XML ", - "NO-DROP": "Glisser/Déposer n'est pas supporté." - } - }, - "ALERT": { - "EDIT-CONFIRM": "Modèle mis à jour" - }, - "ERROR": { - "NOT-FOUND": "Le modèle demandé n'existe pas" - } - }, - - "FORM": { - "NAME": "Nom du formulaire", - "KEY": "Clé du formulaire", - "DESCRIPTION": "Description", - "ACTION": { - "DETAILS": "Afficher les détails", - "EDIT": "Modifier les propriétés du modèle", - "DELETE": "Supprimer le formulaire", - "CREATE-CONFIRM": "Créer un nouveau formulaire", - "DUPLICATE": "Dupliquer ce formulaire", - "DUPLICATE-CONFIRM": "Dupliquer le formulaire", - "OPEN-IN-EDITOR": "Editeur de formulaire", - "EDIT-CONFIRM": "Sauvegarder", - "DELETE-CONFIRM": "Supprimer le formulaire", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version" - - }, - "DETAILS": { - "HISTORY-TITLE": "Historique", - "LAST-UPDATED-BY": "Dernière modification par {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Créé par {{createdBy}}" - }, - - "POPUP": { - "CREATE-TITLE": "Créer un nouveau formulaire", - "DUPLICATE-TITLE": "Dupliquer le formulaire", - "CREATE-DESCRIPTION": "Vous devez donner un nom au nouveau formulaire et en même temps vous devriez ajouter une description.", - "DUPLICATE-DESCRIPTION": "Vous devez donner un nom au nouveau formulaire et en même temps vous devriez ajouter une description.", - "SAVE-FORM-TITLE": "Sauvegarder le formulaire", - "EDIT-DESCRIPTION": "Modifier les propriétés ci-dessous du formulaire et ensuite appuyer sur Sauvegarder pour mettre à jour le formulaire", - "DELETE-DESCRIPTION": "Êtes-vous sûr de vouloir supprimer le formulaire \"{{name}}\"?", - "EDIT-TITLE":"Editer les détails du formulaire", - "DELETE-TITLE": "Supprimer le formulaire", - "USE-AS-NEW-TITLE": "Utiliser en tant que nouvelle version", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version", - "USE-AS-NEW-DESCRIPTION": "Êtes-vous sûr d'utiliser la version {{version}} pour créer une nouvelle version de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Impossibilité de restaurer le modèle à la version choisie: certains modèles référencés sont manquants car précédemment supprimés. Veuillez mettre à jour votre modèle d'App en conséquence. Modèles manquants:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modèle '{{name}}'avec l'identifiant interne {{id}}, créé par {{createdBy}}" - } - }, - - "DECISION-TABLE": { - "NAME": "Nom de la table de décision", - "KEY": "Clé de la table de décision", - "DESCRIPTION": "Description", - "VERSION-COMMENT": "Commentaire de Version", - "HIT-POLICY": "Hit Policy:", - "ACTION": { - "DETAILS": "Afficher les détails", - "EDIT": "Modifier les propriétés du modèle", - "SHARE": "Partager cette table de décision", - "DELETE": "Supprimer cette table de décision", - "ADD-COMMENT": "+ Ajouter un commentaire", - "CREATE-CONFIRM": "Créer une nouvelle table de décision", - "OPEN-IN-EDITOR": "Editeur de table de décision", - "EXPORT": "Exporter la table de décision", - "DELETE-CONFIRM": "Supprimer la table de décision", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version", - "FAVORITE": "Mettre en favori cette table de décision", - "DUPLICATE": "Dupliquer cette table de décision" - }, - "DETAILS": { - "HISTORY-TITLE": "Historique", - "COMMENTS-TITLE": "Commentaires", - "LAST-UPDATED-BY": "Dernière modification par {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Créé par {{createdBy}}" - }, - "HIT-POLICIES": { - "FIRST": "Les premiers", - "ANY": "Tous", - "UNIQUE": "Unique", - "PRIORITY": "Priorité", - "RULE ORDER": "Ordre des règles", - "OUTPUT ORDER": "Ordre de résultats", - "COLLECT": "Collecte" - }, - "COLLECT-OPERATORS": { - "SUM": "Sum", - "MIN": "Min", - "MAX": "Max", - "COUNT": "Count" - }, - "POPUP": { - "CREATE-TITLE": "Créer une nouvelle table de décision", - "CREATE-DESCRIPTION": "Vous devez donner un nom à la nouvelle table de décision et en même temps vous devriez ajouter une description.", - "SAVE-DESCRIPTION": "Vous devez donner un nom à la nouvelle table de décision ainsi qu'une clé unique et en même temps vous devriez ajouter une description.", - "DUPLICATE-TITLE": "Dupliquer la table de décision", - "DUPLICATE-DESCRIPTION": "Vous devez donner un nom à la nouvelle table de décision et en même temps vous devriez ajouter une description.", - "DELETE-TITLE": "Supprimer la table de décision", - "DELETE-DESCRIPTION": "Êtes-vous sûr de vouloir supprimer la table de décision \"{{name}}\"?", - "SAVE-DECISION-TABLE-TITLE": "Sauvegarder la table de décision", - "IMPORT-DESCRIPTION": "Veuillez naviguer vers ou déposer un fichier de définition DMN XML avec une extension en .dmn ou .dmn.xml", - "IMPORT-TITLE": "Importer un modèle DMN ", - "IMPORT": { - "DROPZONE": "Déposer un fichier DMN XML avec une extension en a .dmn ou .dmn.xml", - "CANCEL-UPLOAD": "Annuler l'envoi", - "ERROR": "Erreurr lors du tratiement du fichier DMN XML", - "NO-DROP": "Glisser/Déposer n'est pas supporté." - }, - "USE-AS-NEW-TITLE": "Utiliser en tant que nouvelle version", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version", - "USE-AS-NEW-DESCRIPTION": "Êtes-vous sûr de vouloir utiliser la version {{version}} pour créer une nouvelle version de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "Impossibilité de restaurer le modèle à la version choisie: certains modèles référencés sont manquants car précédemment supprimés. Veuillez mettre à jour votre modèle d'App en conséquence. Modèles manquants:", - "USE-AS-NEW-UNRESOLVED-MODEL": "Modèle '{{name}}' avec l'identifiant interne {{id}}, créé par {{createdBy}}" - }, - "ALERT": { - "FAVORITE-CONFIRM": "La table de décision est maintenant en favori", - "UN-FAVORITE-CONFIRM": "La table de décision n'est plus marqué en favori" - } - }, - - "APP": { - "NAME": "Nom de la définition d'App", - "KEY": "Clé de la définition d'App", - "DESCRIPTION": "Description", - "ICON": "Icône", - "THEME": "Thème", - "GROUPS-ACCESS": "Groupes avec accès, séparés par des virgules", - "USERS-ACCESS": "Utilisateurs avec access, séparés par des virgules", - "ACTION": { - "DETAILS": "Afficher les détails", - "EDIT": "Modifier les propriétés de la définition d'App", - "DUPLICATE": "Dupliquer la définition", - "SHARE": "Partagé la définition d'App", - "DELETE": "Supprimer la définition d'App", - "CREATE-CONFIRM": "Créer une nouvelle définition d'App", - "DUPLICATE-CONFIRM": "Dupliquer la définition d'App", - "DELETE-CONFIRM": "Supprimer la définition d'App", - "USE-AS-NEW-VERSION": "Utiliser en tant que nouvelle version", - "OPEN-IN-EDITOR": "Editeur d'App", - "PUBLISH": "Publier", - "PUBLISH-CONFIRM": "Publier la définition d'App", - "SELECT-ICON": "Changer l'icône...", - "SELECT-THEME": "Change le thème...", - "EDIT-MODELS": "Editer les modèles inclus", - "EXPORT-ZIP": "Exporter la définition d'App dans un fichier zip", - "EXPORT-BAR": "Exporter la définition d'App en tant que fichier bar deployable" - - }, - "DETAILS": { - "TITLE": "Détails de la définition d'App: {{name}}", - "HISTORY-TITLE": "Historique", - "MODELS-TITLE": "Modèles inclus dans la définition d'App", - "LAST-UPDATED-BY": "Dernière modification par {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY": "Créé par {{createdBy}}", - "NO-DESCRIPTION": "La définition d'App n'a pas de description. Modifier les propriétés de la définition d'App pour en ajouter une", - "NO-MODELS-SELECTED": "Aucun modèle n'a été sélectionné pour cette App" - }, - "TITLE": { - "SELECT-ICON": "Choisir une icône d'App", - "SELECT-THEME": "Choisir des couleurs d'App", - "PREVIEW": "Prévisualiser" - - }, - "POPUP": { - "CREATE-TITLE": "Créer une nouvelle définition d'App", - "DUPLICATE-TITLE": "Dupliquer une définition d'App", - "SAVE-APP-TITLE": "Sauvegarder la définition d'App", - "SAVE-APP-SAVE-SUCCESS": "La définition d'App a été sauvé", - "CREATE-DESCRIPTION": "Vous devez donner un nom à la nouvelle définition d'App et en même temps vous devriez ajouter une description.", - "DUPLICATE-DESCRIPTION": "Vous devez donner un nom à la nouvelle définition d'App et en même temps vous devriez ajouter une description.", - "PUBLISH-TITLE": "Publier la définition d'App", - "PUBLISH-DESCRIPTION": "Êtes-vous sûr de vouloir publier la définition d'App \"{{name}}\"? A noter que cette définition d'App sera versionné et l'App de sera mise à jour s'il existe", - "PUBLISH-FIELD": "Publier? A noter que si la publication est activé,la définition d'App sera versionné et que l'App de workflow sera mis à jour s'il existe. .", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT": "Votre modèle de processus \"{{modelInAppName}}\" a le même identifiant \"{{processDefinitionKey}}\" que le processus déjà déployé \"{{conflictingModelName}}\" de l'App \"{{conflictingAppName}}\". Veuillez changer la valeur de la propriété \"id\" du modèle de processus.", - "PUBLISH-ERROR-PROCESS-ALREADY-USED": "Les modèles de processus sont déjà utilisés dans d'autres applications. Est ce normal ?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP": "App", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS": "App invalide: Duplication trouvé des identifians de processus (modifier la propriété \"id\" des modèles de processus mise en cause):", - "DELETE-TITLE": "Supprimer la définition d'App", - "DELETE-DESCRIPTION": "Êtes-vous sûr de vouloir supprimer la définition d'App \"{{name}}\"?", - "DELETE-DESCRIPTION-WITH-RUNTIME": "Êtes-vous sûr de vouloir supprimer la définition d'App \"{{name}}\"? A noter que la définition d'App a été déployé sur la page d'accueil des tâches et en confirmant l'App sera supprimé des pages d'accueil.", - "DELETE-CASCADE-FALSE": "Supprimer uniquement la version courante de la définition d'App (v{{version}})", - "DELETE-CASCADE-TRUE": "Supprimer aussi toutes les versions précédentes de la définition d'App", - "HAS-CUSTOM-STENCILITEM" : "Modèle \"{{modelName}}\" utilise un stencil avec des objets personnalisés de stencil. Il n'est pas possible d'utiliser ce modèle dans une définition d'App.", - "HAS-VALIDATIONERROR" : "Modèle \"{{modelName}}\" a des erreurs de validations et ne peut être ajouté à une définition d'App. Ouvrez le modèle dans l'éditeur and vérifier les détails des erreurs.", - "IMPORT-DESCRIPTION":"Veuillez naviguer ou déposer une définition d'App avec une extension en .zip", - "IMPORT-TITLE":"Importer un modèle de définition d'App ", - "IMPORT": { - "DROPZONE": "Déposer un fichier de définition d'App en .zip", - "CANCEL-UPLOAD": "Annuler l'envoi", - "RENEWIDM-IDS": "Renouveler les identifiants d'utilisateur et de groupe lors de l'importation de modèles d'étapes et BPMN. Ceci est souvent requis lors de l'importation de la définition d'application dans un environnement Flowable différent. Il essaiera de lier les étapes humaines et les tâches utilisateur au bon utilisateur et groupe dans cet environnement cible.", - "ERROR": "Une erreur s'est produite lors du traitement du fichier", - "NO-DROP": "Glisser/Déposer n'est pas supporté." - }, - "INCLUDE-MODELS-TITLE": "Modèles inclus dans la définition d'App" - }, - "ALERT": { - "DELETE-CONFIRM": "La définition d'App a été supprimé", - "PUBLISH-CONFIRM": "La définition d'App a été publié", - "PUBLISH-ERROR": "Impossible de publier la définition d'App. Veuillez vérifier la validité des références de modèles de processus" - } - }, - - "SHARE-INFO": { - "ACTION": { - "ADD": "Ajouter une autre personne" - } - }, - - "FORM-BUILDER": { - "PALLETTE": { - "TEXT": "Texte", - "MULTILINE-TEXT": "Texte Multiligne", - "PASSWORD": "Mot de passe", - "NUMBER": "Nombre", - "CHECKBOX": "Case à cocher", - "DATE": "Date", - "DROPDOWN": "Liste déroulante", - "RADIO": "Boutton radio", - "PEOPLE": "Personnes", - "GROUP-OF-PEOPLE": "Groupes de personnes", - "UPLOAD": "Téléchargement", - "EXPRESSION": "Expression", - "DECIMAL": "Décimal", - "HYPERLINK": "Lien Hypertexte", - "SPACER": "Spacer", - "HORIZONTAL-LINE": "Horizontal line", - "HEADLINE": "Headline", - "HEADLINE-WITH-LINE":"Headline" - }, - "TABS": { - "GENERAL": "Général", - "OPTIONS": "Options", - "UPLOAD-OPTIONS": "Options de téléchargement", - "ADVANCED-OPTIONS":"Avancé" - }, - "VERSION": "Version {{version}}", - "LAST-UPDATED": "Dernière modification par {{lastUpdatedBy}}, {{lastUpdated | dateformat}}", - "TITLE": { - "DESIGN": "Conception", - "OUTCOME": "Résultats" - }, - "POPUP": { - "EDIT-TITLE": "Editer le champ '{{name}}'", - "EXPRESSION-TITLE": "Editer l'expression" - }, - "MESSAGE": { - "EMPTY-EXPRESSION": "(Aucune valeur de l'expression)", - "EXPRESSION-HELP": "Vous pouvez également afficher les valeurs préalablement soumises dans tout formulaire, dans le cadre du texte, en utilisant une notation de référence comme ${myFieldId}.", - "OPTIONS-EXPRESSION-HELP": "Vous pouvez utiliser une expression pour remplir dynamiquement des options, par exemple en référençant une variable telle que ${optionsVariable}. L'expression doit aboutir à un objet java (java.util.List avec des objets Option) ou à sa représentation json." - }, - "LABEL" : { - "FUNCTIONAL-GROUP": "Sélectionner un groupe..", - "PERSON": "Sélectionner une personne.." - }, - "COMPONENT": { - "LABEL": "Libellé:", - "OVERRIDEID": "Surcharger l'identifiant?", - "ID": "Identifiant:", - "PLACEHOLDER": "Paramètre fictif:", - "OPTIONS": "Options", - "RADIO-BUTTON-DEFAULT": "Option 1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION": "Veuillez en choisir un...", - "DROPDOWN-EMPTY-VALUE-HELP": "Ceci est l'option pour la 'valeur à vide'. Le sélectionner lors de l'utilisation signifie 'aucune valeur' ou 'vide'. Ceci est autorisé pour les champs optionnels mais pas pour les champs obligatoires.", - "OPTIONS-EXPRESSION": "Expression des options:", - "OPTIONS-EXPRESSION-ENABLED": "Activer l'expression des options", - "REQUIRED": "Requis", - "READONLY": "Lecture seul", - "EXPRESSION": "Expression", - "ADD-OPTION": "+ Ajouter une nouvelle option", - "UPLOAD-ALLOW-MULTIPLE": "Autoriser le téléchargement de plusieurs fichiers", - "SIZE": "Taille", - "MAX-LENGTH":"Longueur maximale:", - "MIN-LENGTH":"Longueur minimum:", - "PASSWORD-UNMASK-OPTION": "Option de masquage / démasquage de mot de passe", - "HYPERLINK-URL": "URL line hypertexte", - "REGEX-PATTERN":"Regex standard", - "MASK":{ - "TITLE":"Masque de saisie", - "EXAMPLES":{ - "TITLE":"Exemples:", - "NUMBER":"tous les nombres", - "LETTER":"toutes les lettres", - "NUMBERORLETTER":"N'importe quel nombre ou lettre", - "OPTIONAL":"Rendre le masque optionel (non valide)", - "PHONE":"Téléphone" - } - } - }, - "OUTCOMES": { - "DESCRIPTION": "Vous pouvez définir plusieurs résultats pour cette tâche. Une fois la tâche complété, les utilisateurs choisissent la variable de résultat qui pourra ensuite être utilisé en tant que tel dans le processus.", - "NO-OUTCOMES-OPTION": "Ne pas utiliser les résultats personnalisés, afficher uniquement le boutton 'Terminer'", - "OUTCOMES-OPTION": "Utiliser des résultats personnalisés pour ce formulaire.", - "POSSIBLE-OUTCOMES": "Résultats possibles", - "NEW-OUTCOME-PLACEHOLDER": "Entrer un nouveau résultat", - "ADD": "Ajouter un résultat", - "REMOVE": "Retirer" - } - }, - - "DECISION-TABLE-EDITOR": { - "EMPTY-MESSAGES": { - "NO-VARIABLE-SELECTED": "Indéfini" - }, - "POPUP": { - "EXPRESSION-EDITOR": { - "INPUT-TITLE": "Modifier la colonne d'entrée", - "INPUT-DESCRIPTION": "Sélectionnez la variable d'entrée comme entrée pour la colonne", - "OUTPUT-TITLE": "Modifier la colonne de sortiee", - "OUTPUT-DESCRIPTION": "Sélectionnez une variable de sortie existante ou créez une nouvelle", - "EXPRESSION-LABEL": "Libellé de colonne:", - "EXPRESSION-PLACEHOLDER": "Entrer un libellé optionnel", - "EXPRESSION-VARIABLE-NAME": "Nom de variable:", - "EXPRESSION-VARIABLE-TYPE": "Type de variable:", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER": "Entrer un nom de variable", - "OUTPUT-NEW-VARIABLE-ID": "Variable ID:", - "OUTPUT-NEW-VARIABLE-TYPE": "Type de variable:", - "COMPLEX-EXPRESSION-LABEL": "Expression complexe :", - "ALLOWED-VALUES": "Valeurs autorisées (optionel):", - "OUTPUT-VALUES": "Valeurs de résultats ", - "OUTPUT-VALUES-OPTIONAL": "(optionel):", - "OUTPUT-VALUES-NOT-OPTIONAL": "(drag rows for priority / output order):" - } - }, - "BUTTON-ACTIONS-LABEL": "Actions", - "BUTTON-ADD-INPUT-LABEL": "Ajouter une entrée", - "BUTTON-ADD-OUTPUT-LABEL": "Ajouter une sortie", - "BUTTON-ADD-RULE-LABEL": "Ajouter une règle", - "BUTTON-MOVE-RULE-UPWARDS-LABEL": "Déplacer vers le haut", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL": "Déplacer vers le bas", - "BUTTON-REMOVE-RULE-LABEL": "Retirer une règle", - "ALERT": { - "EXPRESSION-VARIABLE-REQUIRED-ERROR": "Toutes les expressions d'entrée et de sorties doivent référencer un champs de formulaire ou une variable.", - "SAVE-CONFIRM": "La table de décision '{{name}}' a été sauvegardée" - } - }, - - "TOUR": { - "WELCOME-TITLE": "Bienvenue, {{userName}}", - "WELCOME-CONTENT": "Ceci est une introduction à l'éditeur Flowable. Les prochaines étapes vous guideront dans les différentes sections de l'application pour vous aider à démarrer. Appuyez sur la touche ESC pour arrêter à tout moment." , - "PALETTE-TITLE": "La Palette", - "PALETTE-CONTENT": "Tous les éléments disponibles pour créer un processus métier peuvent être trouvées ici. Ils sont organisés dans des groupes logiques. Pour ouvrir un groupe, cliquez simplement dessus:", - "CANVAS-TITLE": "Le Canevas", - "CANVAS-CONTENT": "C'est l'espace de travail sur lequel vous créez votre processus métier. Faites glisser des éléments de la palette sur la gauche et déposez-les sur le canevas pour commencer la modélisation..", - "DRAGDROP-TITLE": "Exemple de glisser-déposer", - "DRAGDROP-CONTENT": "Voici un exemple de comment commencer avec la modélisation:", - "PROPERTIES-TITLE": "Propriétés", - "PROPERTIES-CONTENT": "Ici, vous pouvez configurer les propriétés des éléments constitutif de votre processus métier. Il suffit de sélectionner l'élément sur le canevas et ses propriétés seront affichées. Cliquez sur la propriété si vous souhaitez l'éditer", - "TOOLBAR-TITLE": "La Barre d'outils", - "TOOLBAR-CONTENT": "Toutes les actions peuvent être trouvées ici: sauvegarder ou valider un modèle, copier et coller des éléments d'un processus, etc. Survolez les boutons pour obtenir une description pour une action.", - "END-TITLE": "La Fin", - "END-CONTENT": "C'est tout! Vous pouvez maintenant commencer à modéliser vos processus. Si vous avez des questions, n'hésitez pas à les poser sur le Forum Flowable " - }, - - "FEATURE-TOUR" : { - "BENDPOINT" : { - "TITLE": "Tutorial sur les points de courbure", - "DESCRIPTION" : "Lorsque vous connectez les étapes d'un processus l'une à l'autre en utilisant le flux de séquence (les flèches entre les étapes d'un processus), vous pourriez constater que ces flux de séquence se croisent ou que vous souhaitez les répartir différemment. Pour ce faire, vous pouvez ajouter ou supprimer un point de courbure vers ou à partir d'un flux de séquence.

Comme indiqué ci-dessous dans l'image, cliquez d'abord sur 'Ajouter un point de courbure', puis cliquez sur un flux de séquence pour ajoutez-le. Notez que le flux de séquence vous montrera une indication subtile en vert pour montrer que le point de flexion peut être ajouté là.

La suppression d'un point de courbure suit à nouveau un motif similaire: cliquez sur le bouton 'supprimer le point de courbure' et cliquez sur le bouton courber le point pour le retirer à nouveau." - } - }, - - "ACTION.OK" : "Ok", - "ACTION.SAVE" : "Sauvegarder", - "ACTION.SAVE-AND-CLOSE" : "Sauvegarder et fermer l'éditeur", - "ACTION.SEND" : "Envoyer", - "ACTION.CANCEL" : "Annuler", - "ACTION.SELECT" : "Sélectionner", - "ACTION.ADD" : "Ajouter", - "ACTION.REMOVE" : "Retirer", - "ACTION.MOVE.UP" : "Déplacer l'entrée vers le haut", - "ACTION.MOVE.DOWN" : "Déplacer l'entrée vers le base", - - "TOOLBAR.ACTION.CLOSE" : "Fermer l'éditeur et revenir vers la page de vue d'ensemble", - "TOOLBAR.ACTION.SAVE" : "Sauvegarder le modèle", - "TOOLBAR.ACTION.VALIDATE" : "Valider le modèle", - "TOOLBAR.ACTION.CUT" : "Couper (sélectionner un ou plusieurs éléments dans votre processus métier)", - "TOOLBAR.ACTION.COPY" : "Copier (sélectionner un ou plusieurs éléments dans votre processus métier)", - "TOOLBAR.ACTION.PASTE" : "Coller", - "TOOLBAR.ACTION.DELETE" : "Supprimer l'élément sélectionné", - "TOOLBAR.ACTION.UNDO" : "Annuler", - "TOOLBAR.ACTION.REDO" : "Refaire", - "TOOLBAR.ACTION.ZOOMIN" : "Zoom avant", - "TOOLBAR.ACTION.ZOOMOUT" : "Zoom arrière", - "TOOLBAR.ACTION.ZOOMACTUAL" : "Zoom en taille réelle", - "TOOLBAR.ACTION.ZOOMFIT" : "Zoom pour s'adapter", - "TOOLBAR.ACTION.BENDPOINT.ADD" : "Ajouter un point de courbure sur le flux de séquence sélectionné", - "TOOLBAR.ACTION.BENDPOINT.REMOVE" : "Retirer un point de courbure sur le flux de séquence sélectionné", - "TOOLBAR.ACTION.ALIGNHORIZONTAL" : "Aligner le modèle horizontalement", - "TOOLBAR.ACTION.ALIGNVERTICAL" : "Aligner modèle verticalement", - "TOOLBAR.ACTION.SAMESIZE" : "Même taille", - "TOOLBAR.ACTION.HELP": "Démarrer la visite guidée", - "TOOLBAR.ACTION.FEEDBACK": "Faire un retour d'information", - - "FORM_TOOLBAR.ACTION.SAVE" : "Sauvegarder le modèle", - - "APP_DEFINITION_TOOLBAR.ACTION.SAVE" : "Sauvegarder la définition d'App", - - "BUTTON.ACTION.DELETE.TOOLTIP": "Supprimer un élément from the modèle", - "BUTTON.ACTION.MORPH.TOOLTIP": "Changer un type d'élément", - - "ELEMENT.AUTHOR" : "Auteur", - "ELEMENT.DATE_CREATED" : "Date de creation", - - "PROPERTY.REMOVED" : "supprimé", - "PROPERTY.EMPTY" : "Aucune valeur", - "PROPERTY.PROPERTY.EDIT.TITLE" : "Changer la valeur pour ", - - "PROPERTY.FEEDBACK.TITLE" : "Veuillez ajouter vos commentaires", - - "PROPERTY.ASSIGNMENT.TITLE" : "Tâche", - "PROPERTY.ASSIGNMENT.TYPE" : "Type", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE" : "Identity store", - "PROPERTY.ASSIGNMENT.TYPE.STATIC" : "Valeurs fixées", - "PROPERTY.ASSIGNMENT.ASSIGNEE" : "Personne assignée", - "PROPERTY.ASSIGNMENT.MATCHING" : "Utiliser ↑ et ↓ pour sélectionner et appuyer sur Entrée pour confirmer ou utiliser la souris", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER" : "Choisir une personne assignée", - "PROPERTY.ASSIGNMENT.EMPTY" : "Aucune personne assignée sélectionné", - "PROPERTY.ASSIGNMENT.NONE" : "Aucune ...", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "Recherche un utilisateur", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "Recherche un groupe", - "PROPERTY.ASSIGNMENT.SEARCH": "Recherche: ", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY" : "Personne assignée {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY" : "{{length}} utilisateurs candidats", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS" : "Utilisateurs candidats", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY" : "{{length}} groupes candidats", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS" : "Groupes candidats", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY": "Utilisateur {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY": "Utilisateur {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY": "Champs {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY" : "Initiateur de processus", - "PROPERTY.ASSIGNMENT.IDM.TYPE" : "Tâche", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS" : "Aucun utilisateur candidat sélectionné...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS" : "Aucun groupe candidat sélectionné...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR" : "Assigné à l'initiateur de processus", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER" : "Assigné à un seul utilisateur", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS" : "Utilisateurs candidats", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS" : "Groupes candidats", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE" : "Autoriser l'initiateur de processus à terminer la tâche", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY" : "{{length}} execution listeners", - "PROPERTY.EXECUTIONLISTENERS.EMPTY" : "No execution listeners configured", - "PROPERTY.EXECUTIONLISTENERS.EVENT" : "Événement", - "PROPERTY.EXECUTIONLISTENERS.CLASS" : "Class", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER" : "Entrer un classname", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION" : "Expression", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER" : "Entrer une expression", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Entrer une delegate expression", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED" : "Aucun execution listener sélectionné", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME" : "Nom", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER" : "Entrer un nom", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Entrer une expression", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE" : "valeur de chaîne", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Entrer une valeur de chaîne", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING" : "String", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER" : "Entrer une valeur de chaîne", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION" : "Implementation", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY" : "Aucun champ sélectionné", - - "PROPERTY.FIELDS" : "{{length}} champs", - "PROPERTY.FIELDS.EMPTY" : "Aucun champ sélectionné", - "PROPERTY.FIELDS.NAME" : "Nom", - "PROPERTY.FIELDS.NAME.PLACEHOLDER" : "Entrer un nom", - "PROPERTY.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER" : "Entrer une expression", - "PROPERTY.FIELDS.STRINGVALUE" : "valeur de chaîne", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER" : "Entrer a string value", - "PROPERTY.FIELDS.STRING" : "String", - "PROPERTY.FIELDS.STRING.PLACEHOLDER" : "Entrer a string", - "PROPERTY.FIELDS.IMPLEMENTATION" : "Implémentation", - - "PROPERTY.DATAPROPERTIES.VALUES" : "{{length}} data objects", - "PROPERTY.DATAPROPERTIES.EMPTY" : "Aucun objet de données configuré", - "PROPERTY.DATAPROPERTIES.ID" : "Id", - "PROPERTY.DATAPROPERTIES.ID.PLACEHOLDER" : "Entrer une id", - "PROPERTY.DATAPROPERTIES.NAME" : "Nom", - "PROPERTY.DATAPROPERTIES.NAME.PLACEHOLDER" : "Entrer a nom", - "PROPERTY.DATAPROPERTIES.TYPE" : "Type", - "PROPERTY.DATAPROPERTIES.VALUE.PLACEHOLDER" : "Entrer une value (optionnel)", - "PROPERTY.DATAPROPERTIES.VALUE" : "Valeur par défaut", - - "PROPERTY.FORMPROPERTIES.VALUE" : "{{length}} propriétés de formulaire", - "PROPERTY.FORMPROPERTIES.EMPTY" : "Aucune propriété du formulaire sélectionné", - "PROPERTY.FORMPROPERTIES.ID" : "Identifiant", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER" : "Entrer un identifiant", - "PROPERTY.FORMPROPERTIES.NAME" : "Nom", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER" : "Entrer un nom", - "PROPERTY.FORMPROPERTIES.TYPE" : "Type", - "PROPERTY.FORMPROPERTIES.DATEPATTERN" : "Pattern de Date", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER" : "Entrer un Pattern de date", - "PROPERTY.FORMPROPERTIES.VALUES" : "Valeurs", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY" : "Aucune valeur d'énumération sélectionné", - "PROPERTY.FORMPROPERTIES.VALUES.ID" : "Identifiant", - "PROPERTY.FORMPROPERTIES.VALUES.NAME" : "Nom", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER" : "Entrer un identifiant pour la valeur", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER" : "Entrer un nom pour la valeur", - "PROPERTY.FORMPROPERTIES.EXPRESSION" : "Expression", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER" : "Entrer une expression", - "PROPERTY.FORMPROPERTIES.VARIABLE" : "Variable", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER" : "Entrer une variable", - "PROPERTY.FORMPROPERTIES.DEFAULT" : "default", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER" : "Entrer une default", - "PROPERTY.FORMPROPERTIES.REQUIRED" : "Requise", - "PROPERTY.FORMPROPERTIES.READABLE" : "Lecture", - "PROPERTY.FORMPROPERTIES.WRITABLE" : "Ecriture", - - "PROPERTY.INPARAMETERS.VALUE" : "{{length}} paramètres d'entrée", - "PROPERTY.INPARAMETERS.EMPTY" : "Aucun paramètres d'entrée configuré", - - "PROPERTY.OUTPARAMETERS.VALUE" : "{{length}} paramètres de sortie", - "PROPERTY.OUTPARAMETERS.EMPTY" : "No paramètres de sortie configuré", - - "PROPERTY.PARAMETER.SOURCE" : "Source", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER" : "Entrer une source", - "PROPERTY.PARAMETER.SOURCEEXPRESSION" : "Expression de source", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER" : "Entrer une expression de source", - "PROPERTY.PARAMETER.TARGET" : "Cible (Target)", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER" : "Entrer une Cible", - "PROPERTY.PARAMETER.TARGETEXPRESSION" : "Expression de cible", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER" : "Entrer une expression de cible", - "PROPERTY.PARAMETER.EMPTY" : "Aucun paramètre sélectionné", - - "PROPERTY.PROCESSREFERENCE.EMPTY" : "Aucune référence sélectionnée", - "PROPERTY.PROCESSREFERENCE.TITLE" : "Référence de processus", - "PROPERTY.PROCESSREFERENCE.ERROR.SUBPROCESS" : "Une erreur a été rencontré lors du chargement des processus. Veuillez réessayer ultérieurement", - "PROPERTY.PROCESSREFERENCE.PROCESS.LOADING" : "Chargement des processus...", - "PROPERTY.PROCESSREFERENCE.PROCESS.EMPTY" : "Ce répertoire ne contient pas de processus", - - "PROPERTY.FORMREFERENCE.EMPTY" : "Aucune reference sélectionnée", - "PROPERTY.FORMREFERENCE.TITLE" : "Référence de formulaire", - "PROPERTY.FORMREFERENCE.DESCRIPTION" : "Référence vers un formulaire", - "PROPERTY.FORMREFERENCE.ERROR.FORM" : "Une erreur a été rencontré lors du chargement des formulaires. Veuillez réessayer ultérieurement", - "PROPERTY.FORMREFERENCE.FORM.LOADING" : "Chargement des formulaires...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY" : "Ce répertoire ne contient pas de formulaires", - - "PROPERTY.TASKLISTENERS.VALUE" : "{{length}} task listeners", - "PROPERTY.TASKLISTENERS.EMPTY" : "Aucun task listeners configuré", - "PROPERTY.TASKLISTENERS.EVENT" : "Événements", - "PROPERTY.TASKLISTENERS.CLASS" : "Class", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER" : "Entrer un classname", - "PROPERTY.TASKLISTENERS.EXPRESSION" : "Expression", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER" : "Entrer une expression", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Entrer une delegate expression", - "PROPERTY.TASKLISTENERS.UNSELECTED" : "Aucun task listener sélectionné", - "PROPERTY.TASKLISTENERS.FIELDS.NAME" : "Nom", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER" : "Entrer un nom", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Entrer une expression", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE" : "valeur de chaîne", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Entrer une valeur de chaîne", - "PROPERTY.TASKLISTENERS.FIELDS.STRING" : "String", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER" : "Entrer a string", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION" : "Implémentation", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY" : "Aucun champ sélectionné", - - "PROPERTY.EVENTLISTENERS.DISPLAY" : "{{length}} événement listeners", - "PROPERTY.EVENTLISTENERS.EMPTY" : "Aucun événement listeners configured", - "PROPERTY.EVENTLISTENERS.EVENTS": "Événements", - "PROPERTY.EVENTLISTENERS.RETHROW": "Renvoyer l'événement?", - "PROPERTY.EVENTLISTENERS.CLASS" : "Class", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER" : "Entrer un classname", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Entrer une delegate expression", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE" : "Type de l'entité", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER" : "Entrer le type de l'entité ", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE": "Renvoyer le type d'événement", - "PROPERTY.EVENTLISTENERS.ERRORCODE" : "Code d'erreur", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER" : "Entrer un code d'erreur ", - "PROPERTY.EVENTLISTENERS.MESSAGENAME" : "Nom du Message", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER" : "Entrer le nom du message", - "PROPERTY.EVENTLISTENERS.SIGNALNAME" : "Nom du Signal", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER" : "Entrer le nom du signal", - "PROPERTY.EVENTLISTENERS.UNSELECTED" : "Aucun événement listener sélectionné", - - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE" : "{{length}} lifecycle listeners", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY" : "No lifecycle listeners configured", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT" : "Event", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE" : "Source state", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE" : "Target state", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS" : "Class", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION" : "Expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED" : "No task listener selected", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME" : "Name", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE" : "String value", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Enter a string value", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING" : "String", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER" : "Enter a string", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION" : "Implementation", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY" : "No Field selected", - - "PROPERTY.SIGNALDEFINITIONS.DISPLAY" : "{{length}} définitions de signal", - "PROPERTY.SIGNALDEFINITIONS.EMPTY" : "Aucune définitions de signal configuré", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL": "Global", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE": "Instance de processus ", - "PROPERTY.SIGNALDEFINITIONS.ID" : "Identifiant", - "PROPERTY.SIGNALDEFINITIONS.NAME" : "Nom", - "PROPERTY.SIGNALDEFINITIONS.SCOPE" : "Portée", - - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY" : "{{length}} definitions de message", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY" : "Aucune définitions de message configuré", - "PROPERTY.MESSAGEDEFINITIONS.ID" : "Identifiant", - "PROPERTY.MESSAGEDEFINITIONS.NAME" : "Nom", - - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY" : "Aucune ordre de flux de séquence défini", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY" : "Ordre flux de séquence order défini", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND" : "Aucun flux de séquence sortant trouvé.", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION" : "Définir l'ordre dans lequel le flux de séquence doit être évalué:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE" : "Flux de séquence vers {{targetType}} {{targetTitle}}", - - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE" : "condition du flux de séquence ", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC" : "Condition expression", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY": "Aucune condition définie", - - "PROPERTY.DUEDATE.EMPTY" : "Aucune date d'échéance", - "PROPERTY.DUEDATE.DEFINED" : "Date d'échéance définie", - "PROPERTY.DUEDATE.TITLE" : "Date d'échéance", - "PROPERTY.DUEDATE.EXPRESSION-LABEL" : "Expression de la Date d'échéance ", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE" : "Aucune date d'échéance", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION" : "Définition de l'expression ", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC" : "Durée fixe après la création de la tâche", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD" : "Basé sur le champ", - - "MODEL.SAVE.TITLE" : "Sauvegarder le modèle", - "MODEL.VALIDATE.TITLE" : "Validation des résultats", - "MODEL.NAME" : "Nom", - "MODEL.KEY" : "Clé", - "MODEL.DESCRIPTION" : "Description", - "MODEL.SAVE.NEWVERSION" : "Sauvegarder ceci en tant que nouvelle version? Cela signifie que vous pouvez toujours revenir à une version précédente", - "MODEL.SAVE.COMMENT" : "Commentaire", - "MODEL.SAVE.SAVING" : "Sauvegarder du modèle", - "MODEL.LASTMODIFIEDDATE" : "Dernière sauvegarde", - "MODEL.SAVE.ERROR": "Erreur innatendue: impossible de sauvegarder le modèle", - "MODEL.VALIDATIONERRORS": "Notez que le modèle contient des erreurs de validation. Cela signifie que le modèle ne peut pas être déployé sur le Moteur Flowable dans son état actuel.", - "MODEL.CONFLICT.WRITE": "Impossible de sauvegarder le modèle: '{{userFullName}}' a éffectué des changements à ce modèle", - "MODEL.CONFLICT.WRITE.OPTIONS": "Sélectionner une option pour résoudre ce conflit:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE": "Surcharger l'autre modèle", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES": "Ignorer mes modifications", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS": "Sauvegarder en tant que nouveau modèle", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION": "Créer une nouvelle version", - "MODEL.CONFLICT.SAVEAS" : "Sauvegarder en tant que:", - - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP": "Une activité est sur le point d'être exécutée en compensation d'une autre activité. L'événement cible l'activité qui va être exécutée par compensation", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP": "Une activité a été terminée avec succès", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP": "Une activité a reçu un événement d'erreur. Expédié avant que l'erreur réelle n'ait été reçue par l'activité", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP": "Une nouvelle adhésion a été créée", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP": "Une seule adhésion a été supprimée", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP": "Toutes les adhésions au groupe concerné ont été supprimées. Aucun évènement individuel ne sera envoyé pour des raisons de performances", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP": "Une tâche a été assignée. Ceci est executé en même temps qu'un événement ENTITY_UPDATED", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP": "Une tâche a été effectuée. Déployé avant que l'entité de tâche ne soit supprimée", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP": "Lorsqu'une erreur BPMN a été lancée, mais elle n'a pas été prise dans le processus", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP": "Une nouvelle variable a été créé", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP": "Une variable existante a été supprimé", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP": "Une variable existante a été mis à jour", - - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY" : "Aucune référence sélectionné", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE" : "Référence de la table de décision", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM" : "Une erreur s'est produite lors du chargement des tables de décision. Veuillez réessayer ultérieurement", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING" : "Chargement des tables de décision...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY" : "Ce répertoire ne contient pas de tables de décision", - - "PROPERTY.CASEREFERENCE.EMPTY" : "Aucune référence sélectionné", - "PROPERTY.CASEREFERENCE.TITLE" : "Réference du modèle de cas", - "PROPERTY.CASEREFERENCE.ERROR.FORM" : "Une erreur a été rencontré lors du chargement des modèles de cas. Veuillez réessayer ultérieurement", - "PROPERTY.CASEREFERENCE.CASE.LOADING" : "Chargement des modèles de cas...", - "PROPERTY.CASEREFERENCE.CASE.EMPTY" : "Ce répertoire ne contient pas de modèle de cas" -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/ja-JP.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/ja-JP.json deleted file mode 100644 index 7e1b02c8..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/ja-JP.json +++ /dev/null @@ -1,2883 +0,0 @@ -{ - "GENERAL": { - "MAIN-TITLE": "Flowable エディター", - "NAVIGATION": { - "PROCESSES": "プロセス", - "CASEMODELS": "ケースモデル", - "FORMS": "フォーム", - "DECISIONS": "判断", - "APPS": "アプリ" - }, - "TITLE": { - "SELECT-GROUP": "グループの選択", - "MATCHING-GROUPS": "条件にあうグループ", - "FILTER": "フィルター", - "HISTORY": "履歴" - }, - "ACTION": { - "LOGOUT": "サインアウト", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST": "全定義の表示", - "CANCEL": "キャンセル", - "CLOSE": "閉じる", - "EDIT": "編集", - "SAVE": "保存", - "OPEN": "オープン", - "OK": "OK", - "CONFIRM": "確認", - "CONFIRM-AND-CLOSE": "確認して閉じる", - "NEW-FORM": "新規フォーム", - "CREATE-FORM": "フォームの作成", - "NEW-DECISION-TABLE": "新規デシジョンテーブル", - "CREATE-DECISION-TABLE": "デシジョンテーブルの作成", - "NEW-DECISION-SERVICE": "新規デシジョンサービス", - "CREATE-DECISION-SERVICE": "デシジョンサービスの作成" - }, - "MESSAGE": { - "SELECT-GROUP-HELP": "↑と↓で選択し、エンターで確認", - "PEOPLE-NO-MATCHING-RESULTS": "条件にあうユーザーは見つかりません。", - "GROUP-NO-MATCHING-RESULTS": "条件にあうグループは見つかりません。", - "GROUP-SOURCE-TYPE": "元グループ", - "GROUP-SOURCE-SEARCH-OPTION": "グループ検索", - "GROUP-SOURCE-FIELD-OPTION": "フォームフィールド" - }, - "OTHERS": { - "PROCESS": "プロセス", - "PROCESS_NAVIGATOR": "プロセスナビゲーター", - "NO_STRUCTURAL_ELEMENTS_USED": "構造的要素は使われていません。" - } - }, - "BPMN": { - "TITLE": "プロセスエディター", - "DESCRIPTION": "BPMNプロセスエディター", - "PROPERTYPACKAGES": { - "PROCESS_IDPACKAGE": { - "PROCESS_ID": { - "TITLE": "プロセスID", - "DESCRIPTION": "プロセス定義の識別子です。" - } - }, - "OVERRIDEIDPACKAGE": { - "OVERRIDEID": { - "TITLE": "ID", - "DESCRIPTION": "要素の識別子です。" - } - }, - "NAMEPACKAGE": { - "NAME": { - "TITLE": "名前", - "DESCRIPTION": "BPMN要素の名前です。" - } - }, - "DOCUMENTATIONPACKAGE": { - "DOCUMENTATION": { - "TITLE": "ドキュメンテーション", - "DESCRIPTION": "BPMN要素のドキュメンテーションです。" - } - }, - "CATEGORYPACKAGE": { - "CATEGORYDEFINITION": { - "TITLE": "カテゴリー", - "DESCRIPTION": "BPMN要素のカテゴリーです。" - } - }, - "PROCESS_AUTHORPACKAGE": { - "PROCESS_AUTHOR": { - "TITLE": "プロセスオーサー", - "DESCRIPTION": "プロセス定義の作成者です。" - } - }, - "PROCESS_VERSIONPACKAGE": { - "PROCESS_VERSION": { - "TITLE": "プロセスバージョン文字列(ドキュメントのみ)", - "DESCRIPTION": "ドキュメンテーション用のバージョンの識別子です。" - } - }, - "PROCESS_HISTORYLEVELPACKAGE": { - "PROCESS_HISTORYLEVEL": { - "TITLE": "このプロセス定義の履歴レベルを設定", - "DESCRIPTION": "このプロセス定義の履歴レベルを設定" - } - }, - "ISEXECUTABLEPACKAGE": { - "ISEXECUTABLE": { - "TITLE": "実行可能", - "DESCRIPTION": "このプロセスは実行可能か?" - } - }, - "PROCESS_POTENTIALSTARTERUSERPACKAGE": { - "PROCESS_POTENTIALSTARTERUSER": { - "TITLE": "開始可能なユーザー", - "DESCRIPTION": "どのユーザーがこのプロセスを開始できるか?" - } - }, - "PROCESS_POTENTIALSTARTERGROUPPACKAGE": { - "PROCESS_POTENTIALSTARTERGROUP": { - "TITLE": "開始可能なグループ", - "DESCRIPTION": "どのグループがこのプロセスを開始できるか?" - } - }, - "PROCESS_NAMESPACEPACKAGE": { - "PROCESS_NAMESPACE": { - "TITLE": "ターゲット名前空間", - "DESCRIPTION": "プロセス定義のターゲット名前空間。" - } - }, - "PROCESS_ISEAGEREXECUTIONFETCHPACKAGE": { - "ISEAGEREXECUTIONFETCH": { - "TITLE": "Eager Execution取得", - "DESCRIPTION": "このプロセス定義でEager Execution取得を有効にするか?" - } - }, - "ASYNCHRONOUSDEFINITIONPACKAGE": { - "ASYNCHRONOUSDEFINITION": { - "TITLE": "非同期", - "DESCRIPTION": "アクティビティを非同期と定義。" - } - }, - "DATAPROPERTIESPACKAGE": { - "DATAPROPERTIES": { - "TITLE": "データオブジェクト", - "DESCRIPTION": "データオブジェクトの属性を定義" - } - }, - "EXCLUSIVEDEFINITIONPACKAGE": { - "EXCLUSIVEDEFINITION": { - "TITLE": "排他", - "DESCRIPTION": "このアクティビティを排他と定義。" - } - }, - "EXECUTIONLISTENERSPACKAGE": { - "EXECUTIONLISTENERS": { - "TITLE": "実行リスナー", - "DESCRIPTION": "アクティビティ、プロセス、シーケンスフロー、開始/終了イベントなどのリスナー。" - } - }, - "TASKLISTENERSPACKAGE": { - "TASKLISTENERS": { - "TITLE": "タスクリスナー", - "DESCRIPTION": "ユーザータスクのリスナー" - } - }, - "EVENTLISTENERSPACKAGE": { - "EVENTLISTENERS": { - "TITLE": "イベントリスナー", - "DESCRIPTION": "Flowableエンジン内で発生するイベントのリスナー信号、メッセージ、エラーイベントとして再スローすることもできます" - } - }, - "USERTASKASSIGNMENTPACKAGE": { - "USERTASKASSIGNMENT": { - "TITLE": "割当", - "DESCRIPTION": "ユーザータスクへの割当の定義" - } - }, - "FORMPROPERTIESPACKAGE": { - "FORMPROPERTIES": { - "TITLE": "フォーム属性", - "DESCRIPTION": "フォーム属性の定義" - } - }, - "FORMKEYDEFINITIONPACKAGE": { - "FORMKEYDEFINITION": { - "TITLE": "フォームキー", - "DESCRIPTION": "フォームへの参照のためのキー。" - } - }, - "FORMFIELDVALIDATIONPACKAGE": { - "FORMFIELDVALIDATION": { - "TITLE": "フォーム項目の検証", - "DESCRIPTION": "フォーム提出時の検証。(true/falseや式を設定可能)" - } - }, - "DUEDATEDEFINITIONPACKAGE": { - "DUEDATEDEFINITION": { - "TITLE": "期日", - "DESCRIPTION": "ユーザータスクの期日。" - } - }, - "PRIORITYDEFINITIONPACKAGE": { - "PRIORITYDEFINITION": { - "TITLE": "優先度", - "DESCRIPTION": "ユーザータスクの優先度。" - } - }, - "SERVICETASKCLASSPACKAGE": { - "SERVICETASKCLASS": { - "TITLE": "クラス", - "DESCRIPTION": "サービスタスクロジックを実装しているクラス。" - } - }, - "SERVICETASKEXPRESSIONPACKAGE": { - "SERVICETASKEXPRESSION": { - "TITLE": "式", - "DESCRIPTION": "式により定義されるサービスタスクロジック。" - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE": { - "SERVICETASKDELEGATEEXPRESSION": { - "TITLE": "委譲式", - "DESCRIPTION": "委譲式により定義されるサービスタスクロジック。" - } - }, - "SERVICETASKFAILEDJOBRETRYTIMECYCLEPACKAGE": { - "SERVICETASKFAILEDJOBRETRYTIMECYCLE": { - "TITLE": "失敗時のジョブ再実行サイクル", - "DESCRIPTION": "ジョブ再実行サイクルにより定義されるサービスタスクロジック。" - } - }, - "SERVICETASKFIELDSPACKAGE": { - "SERVICETASKFIELDS": { - "TITLE": "クラス項目", - "DESCRIPTION": "項目拡張" - } - }, - "SERVICETASKEXCEPTIONSPACKAGE": { - "SERVICETASKEXCEPTIONS": { - "TITLE": "例外", - "DESCRIPTION": "マッピングされた例外" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE": { - "SERVICETASKRESULTVARIABLE": { - "TITLE": "結果変数", - "DESCRIPTION": "サービスタスクの結果を格納するプロセス変数の名前" - }, - "SERVICETASKUSELOCALSCOPEFORRESULTVARIABLE": { - "TITLE": "結果変数にローカルスコープを使用", - "DESCRIPTION": "結果変数をローカル変数に限定するフラグ" - } - }, - "SERVICETASKTRIGGERABLEPACKAGE": { - "SERVICETASKTRIGGERABLE": { - "TITLE": "サービスタスクをトリガー可能に設定", - "DESCRIPTION": "サービスタスクをトリガー可能に設定" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE": { - "SERVICETASKSTORERESULTVARIABLETRANSIENT": { - "TITLE": "結果変数を一時的に保存", - "DESCRIPTION": "式の結果をデータベーストランザクションの完了時に永続化させないフラグ" - } - }, - "SCRIPTFORMATPACKAGE": { - "SCRIPTFORMAT": { - "TITLE": "スクリプトフォーマット", - "DESCRIPTION": "スクリプトタスクのフォーマット" - } - }, - "SCRIPTTEXTPACKAGE": { - "SCRIPTTEXT": { - "TITLE": "スクリプト", - "DESCRIPTION": "スクリプトタスクのテキスト" - } - }, - "SCRIPTAUTOSTOREVARIABLESPACKAGE": { - "SCRIPTAUTOSTOREVARIABLES": { - "TITLE": "変数の自動保存", - "DESCRIPTION": "すべてのスクリプト変数を自動的にプロセスに保存。" - } - }, - "SHELLCOMMANDPACKAGE": { - "SHELLCOMMAND": { - "TITLE": "コマンド", - "DESCRIPTION": "シェルタスクコマンド" - } - }, - "SHELLARG1PACKAGE": { - "SHELLARG1": { - "TITLE": "引数1", - "DESCRIPTION": "シェルコマンド引数1" - } - }, - "SHELLARG2PACKAGE": { - "SHELLARG2": { - "TITLE": "引数2", - "DESCRIPTION": "シェルコマンド引数2" - } - }, - "SHELLARG3PACKAGE": { - "SHELLARG3": { - "TITLE": "引数3", - "DESCRIPTION": "シェルコマンド引数3" - } - }, - "SHELLARG4PACKAGE": { - "SHELLARG4": { - "TITLE": "引数4", - "DESCRIPTION": "シェルコマンド引数4" - } - }, - "SHELLARG5PACKAGE": { - "SHELLARG5": { - "TITLE": "引数5", - "DESCRIPTION": "シェルコマンド引数5" - } - }, - "SHELLWAITPACKAGE": { - "SHELLWAIT": { - "TITLE": "待ち", - "DESCRIPTION": "シェルコマンドの完了を待つフラグ" - } - }, - "SHELLOUTPUTVARIABLEPACKAGE": { - "SHELLOUTPUTVARIABLE": { - "TITLE": "出力変数", - "DESCRIPTION": "シェルコマンドの出力を保存する変数" - } - }, - "SHELLERRORCODEVARIABLEPACKAGE": { - "SHELLERRORCODEVARIABLE": { - "TITLE": "エラーコード変数", - "DESCRIPTION": "シェルコマンドのエラーコードを保存する変数" - } - }, - "SHELLREDIRECTERRORPACKAGE": { - "SHELLREDIRECTERROR": { - "TITLE": "エラーをリダイレクト", - "DESCRIPTION": "エラー出力を標準出力にマージするフラグ" - } - }, - "SHELLCLEANENVPACKAGE": { - "SHELLCLEANENV": { - "TITLE": "環境変数のクリア", - "DESCRIPTION": "シェル実行用の環境変数のクリア" - } - }, - "SHELLDIRECTORYPACKAGE": { - "SHELLDIRECTORY": { - "TITLE": "ディレクトリー", - "DESCRIPTION": "シェルプロセスの作業ディレクトリー" - } - }, - "RULETASK_RULESPACKAGE": { - "RULETASK_RULES": { - "TITLE": "ルール", - "DESCRIPTION": "ルールタスクのルール。" - } - }, - "RULETASK_VARIABLES_INPUTPACKAGE": { - "RULETASK_VARIABLES_INPUT": { - "TITLE": "入力変数", - "DESCRIPTION": "ルールタスクの入力変数" - } - }, - "RULETASK_EXCLUDEPACKAGE": { - "RULETASK_EXCLUDE": { - "TITLE": "除外", - "DESCRIPTION": "ルール属性を除外条件として使用。" - } - }, - "RULETASK_RESULTPACKAGE": { - "RULETASK_RESULT": { - "TITLE": "結果変数", - "DESCRIPTION": "ルールタスクの結果変数" - } - }, - "MAILTASKHEADERSPACKAGE": { - "MAILTASKHEADERS": { - "TITLE": "ヘッダー", - "DESCRIPTION": "行分割したメールヘッダー。" - } - }, - "MAILTASKTOPACKAGE": { - "MAILTASKTO": { - "TITLE": "宛先", - "DESCRIPTION": "メールの受信者。カンマ区切りで指定された複数の受信者。" - } - }, - "MAILTASKFROMPACKAGE": { - "MAILTASKFROM": { - "TITLE": "差出人", - "DESCRIPTION": "メールの送信者。指定しない場合は規程のアドレスが使用されます。" - } - }, - "MAILTASKSUBJECTPACKAGE": { - "MAILTASKSUBJECT": { - "TITLE": "件名", - "DESCRIPTION": "メールの表題。" - } - }, - "MAILTASKCCPACKAGE": { - "MAILTASKCC": { - "TITLE": "同報(CC)", - "DESCRIPTION": "メールの同報先。カンマ区切りで指定された複数の受信者。" - } - }, - "MAILTASKBCCPACKAGE": { - "MAILTASKBCC": { - "TITLE": "同報(BCC)", - "DESCRIPTION": "メールの同報先(秘匿)。カンマ区切りで指定された複数の受信者。" - } - }, - "MAILTASKTEXTPACKAGE": { - "MAILTASKTEXT": { - "TITLE": "テキスト", - "DESCRIPTION": "リッチテキストメールに対応していない受信者のためのプレーンテキストのメールの本文。HTMLと組み合わせて利用できます。対応していない場合はテキストのみのバージョンが表示されます。" - }, - "MAILTASKTEXTVAR": { - "TITLE": "テキスト変数", - "DESCRIPTION": "プレーンテキストの内容が保存されるプロセス変数。HTMLと組み合わせて利用できます。対応していない場合はテキストのみのバージョンが表示されます。" - } - }, - "MAILTASKHTMLPACKAGE": { - "MAILTASKHTML": { - "TITLE": "HTML", - "DESCRIPTION": "メール本文に含まれるHTML断片。" - }, - "MAILTASKHTMLVAR": { - "TITLE": "HTML変数", - "DESCRIPTION": "リッチテキストの内容が保存されるプロセス変数。" - } - }, - "MAILTASKCHARSETPACKAGE": { - "MAILTASKCHARSET": { - "TITLE": "文字セット", - "DESCRIPTION": "非英語圏のユーザーのためにメールの文字セットを変更することができます。" - } - }, - "HTTPTASKREQUESTMETHODPACKAGE": { - "HTTPTASKREQUESTMETHOD": { - "TITLE": "リクエストメソッド", - "DESCRIPTION": "リクエストメソッド(GET、POST、PUTなど)" - } - }, - "HTTPTASKREQUESTURLPACKAGE": { - "HTTPTASKREQUESTURL": { - "TITLE": "リクエストURL", - "DESCRIPTION": "リクエストURL(http://flowable.orgなど)" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE": { - "HTTPTASKREQUESTHEADERS": { - "TITLE": "リクエストヘッダー", - "DESCRIPTION": "行分割されたHTTPリクエストヘッダー(Content-Type: application/jsonなど)" - } - }, - "HTTPTASKREQUESTBODYPACKAGE": { - "HTTPTASKREQUESTBODYPACKAGE": { - "TITLE": "リクエストボディ", - "DESCRIPTION": "リクエストボディ(${sampleBody}など)" - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE": { - "HTTPTASKREQUESTBODYENCODING": { - "TITLE": "リクエストボディエンコーディング", - "DESCRIPTION": "リクエストボディのエンコーディング(UTF-8など)" - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE": { - "HTTPTASKREQUESTTIMEOUT": { - "TITLE": "リクエストタイムアウト", - "DESCRIPTION": "ミリ秒単位のリクエストのタイムアウト設定(5000など)" - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE": { - "HTTPTASKDISALLOWREDIRECTS": { - "TITLE": "リダイレクト拒否", - "DESCRIPTION": "HTTPリダイレクトを拒否するフラグ" - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE": { - "HTTPTASKFAILSTATUSCODES": { - "TITLE": "失敗ステータスコード", - "DESCRIPTION": "再実行のためのHTTPレスポンスのステータスコードのカンマ区切りリスト(400、5XXなど)" - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE": { - "HTTPTASKHANDLESTATUSCODES": { - "TITLE": "ステータスコードハンドル", - "DESCRIPTION": "無視するHTTPレスポンスのステータスコードのカンマ区切りリスト(404、3XXなど)" - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE": { - "HTTPTASKIGNOREEXCEPTION": { - "TITLE": "例外無視", - "DESCRIPTION": "例外を無視するフラグ。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT": { - "TITLE": "レスポンスを一時変数に保存", - "DESCRIPTION": "レスポンスを一時変数に保存するフラグ" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE": { - "HTTPTASKSAVERESPONSEASJSON": { - "TITLE": "レスポンスをJSON形式で保存", - "DESCRIPTION": "レスポンスを文字列ではなくJSON形式で保存するフラグ" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the case is faster." - } - }, - "SKIPEXPRESSIONPACKAGE": { - "SKIPEXPRESSION": { - "TITLE": "式のスキップ", - "DESCRIPTION": "タスクに関連する式の実行をスキップ。" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE": { - "HTTPTASKRESPONSEVARIABLENAME": { - "TITLE": "レスポンス変数", - "DESCRIPTION": "HTTPレスポンスを保存する変数。" - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE": { - "HTTPTASKSAVEREQUESTVARIABLES": { - "TITLE": "リクエスト変数の保存", - "DESCRIPTION": "リクエスト変数の保存のフラグ。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERS": { - "TITLE": "レスポンスステータス、ヘッダーの保存", - "DESCRIPTION": "リクエストステータス、ヘッダーなどの保存のフラグ。" - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE": { - "HTTPTASKRESULTVARIABLEPREFIX": { - "TITLE": "結果変数接頭辞", - "DESCRIPTION": "実行変数の接頭辞。" - } - }, - "CALLACTIVITYCALLEDELEMENTPACKAGE": { - "CALLACTIVITYCALLEDELEMENT": { - "TITLE": "呼び出し要素", - "DESCRIPTION": "プロセス参照。" - } - }, - "CALLACTIVITYCALLEDELEMENTTYPEPACKAGE": { - "CALLACTIVITYCALLEDELEMENTTYPE": { - "TITLE": "呼び出し要素タイプ", - "DESCRIPTION": "プロセス参照のタイプ。" - } - }, - "CALLACTIVITYINPARAMETERSPACKAGE": { - "CALLACTIVITYINPARAMETERS": { - "TITLE": "引数", - "DESCRIPTION": "入力パラメータの定義" - } - }, - "CALLACTIVITYOUTPARAMETERSPACKAGE": { - "CALLACTIVITYOUTPARAMETERS": { - "TITLE": "返値", - "DESCRIPTION": "出力パラメータの定義" - } - }, - "CALLACTIVITYINHERITVARIABLESPACKAGE": { - "CALLACTIVITYINHERITVARIABLES": { - "TITLE": "変数のサブプロセス継承", - "DESCRIPTION": "親プロセスの変数をサブプロセスに継承。" - } - }, - "CALLACTIVITYSAMEDEPLOYMENTPACKAGE": { - "CALLACTIVITYSAMEDEPLOYMENT": { - "TITLE": "同じデプロイから参照プロセスを開始", - "DESCRIPTION": "同じデプロイからの参照プロセスを使用。" - } - }, - "CALLACTIVITYFALLBACKTODEFAULTTENANTPACKAGE": { - "CALLACTIVITYFALLBACKTODEFAULTTENANT": { - "TITLE": "規定のテナントにフォールバック", - "DESCRIPTION": "テナント探索に失敗した場合デフォルトのテナントを使用。" - } - }, - "CALLACTIVITYIDVARIABLENAMEPACKAGE": { - "CALLACTIVITYIDVARIABLENAME": { - "TITLE": "ID変数", - "DESCRIPTION": "開始したインスタンスのIDをこの変数に保存" - } - }, - "CALLACTIVITYPROCESSINSTANCENAMEPACKAGE": { - "CALLACTIVITYPROCESSINSTANCENAME": { - "TITLE": "プロセスインスタンス名", - "DESCRIPTION": "子プロセスインスタンス名を指定する式" - } - }, - "CALLACTIVITYINHERITBUSINESSKEYPACKAGE": { - "CALLACTIVITYINHERITBUSINESSKEY": { - "TITLE": "ビジネスキー継承", - "DESCRIPTION": "親プロセスからビジネスキーを継承。" - } - }, - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERSPACKAGE": { - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERS": { - "TITLE": "出力パラメータにローカルスコープを使用", - "DESCRIPTION": "出力パラメータにローカルスコープ変数を使用" - } - }, - "CALLACTIVITYBUSINESSKEYPACKAGE": { - "CALLACTIVITYBUSINESSKEY": { - "TITLE": "ビジネスキー式", - "DESCRIPTION": "子プロセスインスタンスのビジネスキーを指定する式" - } - }, - "CALLACTIVITYCOMPLETEASYNCPACKAGE": { - "CALLACTIVITYCOMPLETEASYNC": { - "TITLE": "非同期に完了", - "DESCRIPTION": "子プロセスを非同期に終了し呼び出しを完了する。複数のインスタンスを平行して使用する場合に便利です。" - } - }, - "CAMELTASKCAMELCONTEXTPACKAGE": { - "CAMELTASKCAMELCONTEXT": { - "TITLE": "Camelコンテクスト", - "DESCRIPTION": "追加のCamelコンテクスト定義。空の場合は規定値が使われる。" - } - }, - "MULETASKENDPOINTURLPACKAGE": { - "MULETASKENDPOINTURL": { - "TITLE": "エンドポイントURL", - "DESCRIPTION": "Muleにメッセージを送る場合に必要なエンドポイントURL。" - } - }, - "MULETASKLANGUAGEPACKAGE": { - "MULETASKLANGUAGE": { - "TITLE": "言語", - "DESCRIPTION": "ペイロード式を解決する言語の定義。" - } - }, - "MULETASKPAYLOADEXPRESSIONPACKAGE": { - "MULETASKPAYLOADEXPRESSION": { - "TITLE": "ペイロード式", - "DESCRIPTION": "Muleに送るメッセージの定義。" - } - }, - "MULETASKRESULTVARIABLEPACKAGE": { - "MULETASKRESULTVARIABLE": { - "TITLE": "結果変数", - "DESCRIPTION": "ペイロードの返値を格納する変数。" - } - }, - "CONDITIONSEQUENCEFLOWPACKAGE": { - "CONDITIONSEQUENCEFLOWPACKAGE": { - "TITLE": "フロー条件", - "DESCRIPTION": "シーケンスフローの条件" - } - }, - "DEFAULTFLOWPACKAGE": { - "DEFAULTFLOW": { - "TITLE": "既定フロー", - "DESCRIPTION": "既定のシーケンスフローを定義" - } - }, - "CONDITIONALFLOWPACKAGE": { - "CONDITIONALFLOW": { - "TITLE": "条件付きフロー", - "DESCRIPTION": "条件付きのフローを定義" - } - }, - "TIMERCYCLEDEFINITIONPACKAGE": { - "TIMERCYCLEDEFINITION": { - "TITLE": "タイムサイクル(R3/PT10Hなど)", - "DESCRIPTION": "ISO-8601 サイクルのタイマーを定義。" - } - }, - "TIMERDATEDEFINITIONPACKAGE": { - "TIMERDATEDEFINITION": { - "TITLE": "ISO-8601日時", - "DESCRIPTION": "ISO-8601日付仕様のタイマーを定義。" - } - }, - "TIMERDURATIONDEFINITIONPACKAGE": { - "TIMERDURATIONDEFINITION": { - "TITLE": "継続時間(PT5Mなど)", - "DESCRIPTION": " ISO-8601継続時間のタイマーを定義。" - } - }, - "TIMERENDDATEDEFINITIONPACKAGE": { - "TIMERENDDATEDEFINITION": { - "TITLE": "ISO-8601終了時間", - "DESCRIPTION": " ISO-8601継続時間のタイマーを定義。" - } - }, - "MESSAGEREFPACKAGE": { - "MESSAGEREF": { - "TITLE": "メッセージ参照", - "DESCRIPTION": "メッセージ名を定義。" - } - }, - "SIGNALREFPACKAGE": { - "SIGNALREF": { - "TITLE": "信号参照", - "DESCRIPTION": "信号名を定義。" - } - }, - "COMPENSATIONACTIVITYREFPACKAGE" : { - "COMPENSATIONACTIVITYREF" : { - "TITLE" : "報酬活動リファレンス", - "DESCRIPTION" : "アクティビティ参照を定義します。" - } - }, - "ERRORREFPACKAGE": { - "ERRORREF": { - "TITLE": "エラー参照", - "DESCRIPTION": "エラー名を定義。" - } - }, - "ESCALATIONREFPACKAGE": { - "ESCALATIONREF": { - "TITLE": "エスカレーション参照", - "DESCRIPTION": "エスカレーション名を定義。" - } - }, - "CONDITIONALEVENTPACKAGE": { - "CONDITION": { - "TITLE": "条件式", - "DESCRIPTION": "条件付きイベントの条件式を定義。" - } - }, - "CANCELACTIVITYPACKAGE": { - "CANCELACTIVITY": { - "TITLE": "アクティビティのキャンセル", - "DESCRIPTION": "アクティビティがキャンセルされる" - } - }, - "INITIATORPACKAGE": { - "INITIATOR": { - "TITLE": "イニシエーター", - "DESCRIPTION": "プロセスのイニシエーター(開始)" - } - }, - "TEXTPACKAGE": { - "TEXT": { - "TITLE": "テキスト", - "DESCRIPTION": "アノテーションのテキスト。" - } - }, - "MULTIINSTANCE_TYPEPACKAGE": { - "MULTIINSTANCE_TYPE": { - "TITLE": "マルチインスタンスタイプ", - "DESCRIPTION": "アクティビティの繰り返し実行(平行、連続)を異なるループタイプで表示" - } - }, - "MULTIINSTANCE_CARDINALITYPACKAGE": { - "MULTIINSTANCE_CARDINALITY": { - "TITLE": "複合度(マルチインスタンス)", - "DESCRIPTION": "マルチインスタンスの複合度を定義。" - } - }, - "MULTIINSTANCE_COLLECTIONPACKAGE": { - "MULTIINSTANCE_COLLECTION": { - "TITLE": "コレクション(マルチインスタンス)", - "DESCRIPTION": "マルチインスタンスのコレクションを定義。" - } - }, - "MULTIINSTANCE_VARIABLEPACKAGE": { - "MULTIINSTANCE_VARIABLE": { - "TITLE": "要素変数(マルチインスタンス)", - "DESCRIPTION": "マルチインスタンスの要素変数を定義。" - } - }, - "MULTIINSTANCE_CONDITIONPACKAGE": { - "MULTIINSTANCE_CONDITION": { - "TITLE": "完了条件(マルチインスタンス)", - "DESCRIPTION": "マルチインスタンスの完了条件を定義。" - } - }, - "ISFORCOMPENSATIONPACKAGE": { - "ISFORCOMPENSATION": { - "TITLE": "補償", - "DESCRIPTION": "アクティビティが補償目的のものであることを示すフラグ。" - } - }, - "SEQUENCEFLOWORDERPACKAGE": { - "SEQUENCEFLOWORDER": { - "TITLE": "フロー順", - "DESCRIPTION": "出力シーケンスフローの順番。" - } - }, - "SIGNALDEFINITIONSPACKAGE": { - "SIGNALDEFINITIONS": { - "TITLE": "信号定義", - "DESCRIPTION": "信号定義" - } - }, - "MESSAGEDEFINITIONSPACKAGE": { - "MESSAGEDEFINITIONS": { - "TITLE": "メッセージ定義", - "DESCRIPTION": "メッセージ定義" - } - }, - "ESCALATIONDEFINITIONSPACKAGE": { - "ESCALATIONDEFINITIONS": { - "TITLE": "エスカレーション定義", - "DESCRIPTION": "エスカレーション定義" - } - }, - "EVENTREGISTRYPACKAGE": { - "EVENTKEY": { - "TITLE": "イベントキー", - "DESCRIPTION": "イベントキーの定義" - }, - "EVENTNAME": { - "TITLE": "イベント名", - "DESCRIPTION": "イベント名の定義" - }, - "EVENTINPARAMETERS": { - "TITLE": "イベントペイロードへのマッピング", - "DESCRIPTION": "イベントペイロード属性にプロセス変数をマッピング" - }, - "EVENTOUTPARAMETERS": { - "TITLE": "イベントペイロードからのマッピング", - "DESCRIPTION": "プロセス変数にイベントペイロード属性をマッピング" - }, - "EVENTCORRELATIONPARAMETERS": { - "TITLE": "相関パラメーター", - "DESCRIPTION": "相関パラメーターの定義" - }, - "CHANNELKEY": { - "TITLE": "チャンネルキー", - "DESCRIPTION": "チャンネルキーの定義" - }, - "CHANNELNAME": { - "TITLE": "チャンネル名", - "DESCRIPTION": "チャンネル名の定義" - }, - "CHANNELTYPE": { - "TITLE": "チャンネルタイプ", - "DESCRIPTION": "チャンネルタイプの定義" - }, - "CHANNELDESTINATION": { - "TITLE": "チャンネルの宛先", - "DESCRIPTION": "チャンネルの宛先の定義" - }, - "TRIGGEREVENTKEY": { - "TITLE": "トリガーイベントキー", - "DESCRIPTION": "トリガーイベントキーの定義" - }, - "TRIGGEREVENTNAME": { - "TITLE": "トリガーイベント名", - "DESCRIPTION": "トリガーイベント名の定義" - }, - "TRIGGERCHANNELKEY": { - "TITLE": "トリガーチャンネルキー", - "DESCRIPTION": "トリガーチャンネルキーの定義" - }, - "TRIGGERCHANNELNAME": { - "TITLE": "トリガーチャンネル名", - "DESCRIPTION": "トリガーチャンネル名の定義" - }, - "TRIGGERCHANNELTYPE": { - "TITLE": "トリガーチャンネルタイプ", - "DESCRIPTION": "トリガーチャンネルタイプの定義" - }, - "TRIGGERCHANNELDESTINATION": { - "TITLE": "トリガーチャンネルの宛先", - "DESCRIPTION": "トリガーチャンネルの宛先の定義" - }, - "KEYDETECTIONFIXEDVALUE": { - "TITLE": "イベントキー固定値", - "DESCRIPTION": "イベントキー固定値の定義" - }, - "KEYDETECTIONJSONFIELD": { - "TITLE": "イベントキーJSONフィールド", - "DESCRIPTION": "JSONフィールドによるイベントキー検知の定義" - }, - "KEYDETECTIONJSONPOINTER": { - "TITLE": "イベントキーJSONポインター", - "DESCRIPTION": "JSONポインター式によるイベントキー検知の定義" - } - }, - "EXTERNALWORKERJOBPACKAGE": { - "TOPIC": { - "TITLE": "ジョブトピック", - "DESCRIPTION": "外部ワーカーが使用する可能性があるジョブトピック" - } - }, - "ISTRANSACTIONPACKAGE": { - "ISTRANSACTION": { - "TITLE": "トランザクションサブプロセス", - "DESCRIPTION": "サブプロセスがトランザクション型であることを示すフラグ。" - } - }, - "FORMREFERENCEPACKAGE": { - "FORMREFERENCE": { - "TITLE": "フォーム参照", - "DESCRIPTION": "フォームへの参照" - } - }, - "TERMINATEALLPACKAGE": { - "TERMINATEALL": { - "TITLE": "すべて停止", - "DESCRIPTION": "プロセスインスタンスを停止可能" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONTABLEREFERENCE": { - "TITLE": "デシジョンテーブル参照", - "DESCRIPTION": "デシジョンテーブルへの参照を設定" - } - }, - "DECISIONTASKDECISIONSERVICEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONSERVICEREFERENCE": { - "TITLE": "デシジョンサービス参照", - "DESCRIPTION": "デシジョンサービスへの参照を設定" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE": { - "DECISIONTASKTHROWERRORONNOHITS": { - "TITLE": "ルールがヒットしない場合はエラー", - "DESCRIPTION": "デシジョンテーブル上のルールにヒットせず結果が得られない場合はエラーとする。" - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE": { - "DECISIONTASKFALLBACKTODEFAULTTENANT": { - "TITLE": "規定のテナントにフォールバック", - "DESCRIPTION": "テナント付きの条件で失敗した場合は既定の条件で判断の定義を検索。" - } - }, - "INTERRUPTINGPACKAGE": { - "INTERRUPTING": { - "TITLE": "中断", - "DESCRIPTION": "親実行を停止させるフラグ。" - } - }, - "COMPLETIONCONDITIONPACKAGE": { - "COMPLETIONCONDITION": { - "TITLE": "完了条件", - "DESCRIPTION": "アドホックサブプロセスの完了条件" - } - }, - "ORDERINGPACKAGE": { - "ORDERING": { - "TITLE": "順番", - "DESCRIPTION": "アドホックサブプロセスの順番" - } - }, - "CANCELREMAININGINSTANCESPACKAGE": { - "CANCELREMAININGINSTANCES": { - "TITLE": "残存インスタンスのキャンセル", - "DESCRIPTION": "アドホックサブプロセスのための残存インスタンスをキャンセルするフラグ。" - } - } - }, - "STENCILS": { - "GROUPS": { - "STARTEVENTS": "開始イベント", - "ENDEVENTS": "終了イベント", - "DIAGRAM": "ダイヤグラム", - "ACTIVITIES": "アクティビティ", - "STRUCTURAL": "構造的", - "GATEWAYS": "ゲートウェイ", - "BOUNDARYEVENTS": "境界イベント", - "INTERMEDIATECATCHINGEVENTS": "中間受信イベント", - "INTERMEDIATETHROWINGEVENTS": "中間送信イベント", - "SWIMLANES": "スイムレーン", - "CONNECTINGOBJECTS": "接続オブジェクト", - "ARTIFACTS": "構造物" - }, - "BPMNDIAGRAM": { - "TITLE": "BPMNダイアグラム", - "DESCRIPTION": "BPMN2.0のダイアグラム" - }, - "STARTNONEEVENT": { - "TITLE": "開始イベント", - "DESCRIPTION": "トリガーなしの開始イベント" - }, - "STARTTIMEREVENT": { - "TITLE": "タイマー開始イベント", - "DESCRIPTION": "タイマートリガー付きの開始イベント" - }, - "STARTSIGNALEVENT": { - "TITLE": "信号開始イベント", - "DESCRIPTION": "信号トリガー付きの開始イベント" - }, - "STARTMESSAGEEVENT": { - "TITLE": "メッセージ開始イベント", - "DESCRIPTION": "メッセージトリガー付きの開始イベント" - }, - "STARTEVENTREGISTRYEVENT": { - "TITLE": "レジストリー開始イベント", - "DESCRIPTION": "レジストリートリガー付きの開始イベント" - }, - "STARTCONDITIONALEVENT": { - "TITLE": "条件付き開始イベント", - "DESCRIPTION": "条件付きイベントによって評価される開始イベント" - }, - "STARTERROREVENT": { - "TITLE": "エラー開始イベント", - "DESCRIPTION": "BPMNエラーをキャッチする開始イベント" - }, - "STARTESCALATIONEVENT": { - "TITLE": "エスカレーション開始イベント", - "DESCRIPTION": "BPMNエスカレーションをキャッチする開始イベント" - }, - "USERTASK": { - "TITLE": "ユーザータスク", - "DESCRIPTION": "特定の人に割当られたマニュアルタスク" - }, - "SERVICETASK": { - "TITLE": "サービスタスク", - "DESCRIPTION": "サービスロジックによる自動タスク" - }, - "SCRIPTTASK": { - "TITLE": "スクリプトタスク", - "DESCRIPTION": "スクリプトロジックによる自動タスク" - }, - "BUSINESSRULE": { - "TITLE": "ビジネスルールタスク", - "DESCRIPTION": "ルールロジックによる自動タスク" - }, - "RECEIVETASK": { - "TITLE": "受信タスク", - "DESCRIPTION": "信号を待つタスク" - }, - "RECEIVEEVENTTASK": { - "TITLE": "イベント受信タスク", - "DESCRIPTION": "イベントを受信するタスク" - }, - "MANUALTASK": { - "TITLE": "マニュアルタスク", - "DESCRIPTION": "ロジックがない自動タスク" - }, - "MAILTASK": { - "TITLE": "メールタスク", - "DESCRIPTION": "メールタスク" - }, - "CAMELTASK": { - "TITLE": "Camelタスク", - "DESCRIPTION": "Camelへメッセージを送るタスク" - }, - "HTTPTASK": { - "TITLE": "HTTPタスク", - "DESCRIPTION": "HTTPタスク" - }, - "MULETASK": { - "TITLE": "Muleタスク", - "DESCRIPTION": "Muleへメッセージを送るタスク" - }, - "SENDTASK": { - "TITLE": "送信タスク", - "DESCRIPTION": "メッセージを送信するタスク" - }, - "DECISIONTASK": { - "TITLE": "判断タスク", - "DESCRIPTION": "Flowable DMNルールエンジンを使うタスク" - }, - "SENDEVENTTASK": { - "TITLE": "イベント送信タスク", - "DESCRIPTION": "イベントレジストリーにイベントを送信するタスク" - }, - "EXTERNALWORKERTASK": { - "TITLE": "外部ワーカータスク", - "DESCRIPTION": "外部ワーカーによって実行されるジョブを作るタスク" - }, - "SHELLTASK": { - "TITLE": "シェルタスクs", - "DESCRIPTION": "シェルバッチロジックによる自動タスク" - }, - "SUBPROCESS": { - "TITLE": "サブプロセス", - "DESCRIPTION": "サブプロセススコープ" - }, - "COLLAPSEDSUBPROCESS": { - "TITLE": "折りたたまれたサブプロセス", - "DESCRIPTION": "サブプロセススコープ" - }, - "EVENTSUBPROCESS": { - "TITLE": "イベントサブプロセス", - "DESCRIPTION": "イベントサブプロセススコープ" - }, - "CALLACTIVITY": { - "TITLE": "呼び出しアクティビティ", - "DESCRIPTION": "呼び出しアクティビティ" - }, - "EXCLUSIVEGATEWAY": { - "TITLE": "排他ゲートウェイ", - "DESCRIPTION": "選択ゲートウェイ" - }, - "PARALLELGATEWAY": { - "TITLE": "平行ゲートウェイ", - "DESCRIPTION": "平行ゲートウェイ" - }, - "INCLUSIVEGATEWAY": { - "TITLE": "包含ゲートウェイ", - "DESCRIPTION": "包含ゲートウェイ" - }, - "EVENTGATEWAY": { - "TITLE": "イベントゲートウェイ", - "DESCRIPTION": "イベントゲートウェイ" - }, - "BOUNDARYCONDITIONALEVENT": { - "TITLE": "条件付き境界イベント", - "DESCRIPTION": "条件付きイベントを評価する境界イベント" - }, - "BOUNDARYERROREVENT": { - "TITLE": "エラー境界イベント", - "DESCRIPTION": "BPMNエラーをキャッチする境界イベント" - }, - "BOUNDARYESCALATIONEVENT": { - "TITLE": "エスカレーション境界イベント", - "DESCRIPTION": "BPMNエスカレーションをキャッチする境界イベント" - }, - "BOUNDARYTIMEREVENT": { - "TITLE": "タイマー境界イベント", - "DESCRIPTION": "タイマートリガー付きの境界イベント" - }, - "BOUNDARYSIGNALEVENT": { - "TITLE": "信号境界イベント", - "DESCRIPTION": "信号トリガー付き境界イベント" - }, - "BOUNDARYMESSAGEEVENT": { - "TITLE": "メッセージ境界イベント", - "DESCRIPTION": "メッセージトリガー付きの境界イベント" - }, - "BOUNDARYCANCELEVENT": { - "TITLE": "キャンセル境界イベント", - "DESCRIPTION": "キャンセル境界イベント" - }, - "BOUNDARYEVENTREGISTRYEVENT": { - "TITLE": "レジストリー境界イベント", - "DESCRIPTION": "レジストリー境界イベント" - }, - "BOUNDARYCOMPENSATIONEVENT": { - "TITLE": "補償境界イベント", - "DESCRIPTION": "補償境界イベント" - }, - "CATCHTIMEREVENT": { - "TITLE": "タイマー中間受信イベント", - "DESCRIPTION": "タイマートリガー付きの中間受信イベント" - }, - "CATCHSIGNALEVENT": { - "TITLE": "信号中間受信イベント", - "DESCRIPTION": "信号トリガー付きの中間受信イベント" - }, - "CATCHMESSAGEEVENT": { - "TITLE": "メッセージ中間受信イベント", - "DESCRIPTION": "メッセージトリガー付きの中間受信イベント" - }, - "CATCHCONDITIONALEVENT": { - "TITLE": "条件付き中間受信イベント", - "DESCRIPTION": "条件トリガー付き中間受信イベント" - }, - "CATCHEVENTREGISTRYEVENT": { - "TITLE": "レジストリー中間受信イベント", - "DESCRIPTION": "イベントレジストリーからのイベント受信を待つ中間イベント" - }, - "THROWNONEEVENT": { - "TITLE": "トリガーなし中間イベント", - "DESCRIPTION": "特定のトリガーを持たない中間イベント" - }, - "THROWSIGNALEVENT": { - "TITLE": "信号中間送信イベント", - "DESCRIPTION": "信号トリガー付きの中間イベント" - }, - "THROWESCALATIONEVENT": { - "TITLE": "エスカレーション中間送信イベント", - "DESCRIPTION": "エスカレーショントリガー付きの中間送信イベント" - }, - "THROWCOMPENSATIONEVENT": { - "TITLE" : "中間補償スローイベント", - "DESCRIPTION" : "補償トリガーを伴う中間イベント" - }, - "ENDNONEEVENT": { - "TITLE": "終了イベント", - "DESCRIPTION": "特定のトリガーを持たない終了イベント" - }, - "ENDERROREVENT": { - "TITLE": "エラー終了イベント", - "DESCRIPTION": "エラーを送信する終了イベント" - }, - "ENDESCALATIONEVENT": { - "TITLE": "エスカレーション終了イベント", - "DESCRIPTION": "エスカレーションを送信する終了イベント" - }, - "ENDCANCELEVENT": { - "TITLE": "キャンセル終了イベント", - "DESCRIPTION": "キャンセル終了イベント" - }, - "ENDTERMINATEEVENT": { - "TITLE": "停止終了イベント", - "DESCRIPTION": "停止終了イベント" - }, - "POOL": { - "TITLE": "プール", - "DESCRIPTION": "プロセス定義を構成するプール" - }, - "LANE": { - "TITLE": "レーン", - "DESCRIPTION": "プロセス定義を構成するレーン" - }, - "SEQUENCEFLOW": { - "TITLE": "シーケンスフロー", - "DESCRIPTION": "アクティビティの実行順を定義するシーケンスフロー" - }, - "MESSAGEFLOW": { - "TITLE": "メッセージフロー", - "DESCRIPTION": "異なるプールにある要素を繋ぐメッセージフロー" - }, - "ASSOCIATION": { - "TITLE": "関連", - "DESCRIPTION": "要素とテキストアノテーションの接続" - }, - "DATAASSOCIATION": { - "TITLE": "データ関連", - "DESCRIPTION": "アクティビティとデータ要素の接続" - }, - "TEXTANNOTATION": { - "TITLE": "テキストアノテーション", - "DESCRIPTION": "要素の説明テキスト。" - }, - "DATASTORE": { - "TITLE": "データストア", - "DESCRIPTION": "データストアの参照。" - }, - "ADHOCSUBPROCESS": { - "TITLE": "アドホックサブプロセス", - "DESCRIPTION": "アドホックサブプロセス" - } - } - }, - "CMMN": { - "TITLE": "CMMNエディター", - "DESCRIPTION": "CMMNケースエディター", - "PROPERTYPACKAGES": { - "CASE_IDPACKAGE": { - "CASE_ID": { - "TITLE": "ケースID", - "DESCRIPTION": "ケース定義のユニークID。" - } - }, - "OVERRIDEIDPACKAGE": { - "OVERRIDEID": { - "TITLE": "ID", - "DESCRIPTION": "要素の識別子です。" - } - }, - "NAMEPACKAGE": { - "NAME": { - "TITLE": "名前", - "DESCRIPTION": "CMMN要素の名前。" - } - }, - "DOCUMENTATIONPACKAGE": { - "DOCUMENTATION": { - "TITLE": "ドキュメンテーション", - "DESCRIPTION": "CMMN要素の名前。" - } - }, - "BLOCKINGPACKAGE": { - "ISBLOCKING": { - "TITLE": "ブロッキング", - "DESCRIPTION": "真偽型属性、標準ではtrue。falseの場合は関連するロジックを実行した後でタスクを自動的に完了する" - }, - "ISBLOCKINGEXPRESSION": { - "TITLE": "ブロッキング式", - "DESCRIPTION": "実行時にタスクをブロックするかどうかを判定する式。設定すると、ブロッキング設定は無視されます。" - } - }, - "CASE_INITIATORVARIABLENAMEPACKAGE": { - "CASE_INITIATORVARIABLENAME": { - "TITLE": "イニシエーター変数", - "DESCRIPTION": "ケースイニシエーターの値に使用する変数の名前。" - } - }, - "CASE_AUTHORPACKAGE": { - "CASE_AUTHOR": { - "TITLE": "ケースオーサー", - "DESCRIPTION": "ケース定義の作成者。" - } - }, - "CASE_VERSIONPACKAGE": { - "CASE_VERSION": { - "TITLE": "ケースバージョン文字列(ドキュメントのみ)", - "DESCRIPTION": "ドキュメンテーション用のバージョンの識別子です。" - } - }, - "CASE_NAMESPACEPACKAGE": { - "CASE_NAMESPACE": { - "TITLE": "ターゲット名前空間", - "DESCRIPTION": "ケース定義のターゲット名前空間。" - } - }, - "USERTASKASSIGNMENTPACKAGE": { - "USERTASKASSIGNMENT": { - "TITLE": "割当", - "DESCRIPTION": "ユーザータスクへの割当の定義" - } - }, - "TASKLISTENERSPACKAGE": { - "TASKLISTENERS": { - "TITLE": "タスクリスナー", - "DESCRIPTION": "ヒューマンタスクのリスナー" - } - }, - "FORMPROPERTIESPACKAGE": { - "FORMPROPERTIES": { - "TITLE": "フォーム属性", - "DESCRIPTION": "フォーム属性の定義" - } - }, - "FORMKEYDEFINITIONPACKAGE": { - "FORMKEYDEFINITION": { - "TITLE": "フォームキー", - "DESCRIPTION": "フォームへの参照のためのキー。" - } - }, - "FORMFIELDVALIDATIONPACKAGE": { - "FORMFIELDVALIDATION": { - "TITLE": "フォーム項目の検証", - "DESCRIPTION": "フォーム提出時の検証。(true/falseや式を設定可能)" - } - }, - "DUEDATEDEFINITIONPACKAGE": { - "DUEDATEDEFINITION": { - "TITLE": "期日", - "DESCRIPTION": "ユーザータスクの期日。" - } - }, - "PRIORITYDEFINITIONPACKAGE": { - "PRIORITYDEFINITION": { - "TITLE": "優先度", - "DESCRIPTION": "ユーザータスクの優先度。" - } - }, - "SERVICETASKCLASSPACKAGE": { - "SERVICETASKCLASS": { - "TITLE": "クラス", - "DESCRIPTION": "サービスタスクロジックを実装しているクラス。" - } - }, - "SERVICETASKEXPRESSIONPACKAGE": { - "SERVICETASKEXPRESSION": { - "TITLE": "式", - "DESCRIPTION": "式により定義されるサービスタスクロジック。" - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE": { - "SERVICETASKDELEGATEEXPRESSION": { - "TITLE": "委譲式", - "DESCRIPTION": "委譲式により定義されるサービスタスクロジック。" - } - }, - "SERVICETASKFIELDSPACKAGE": { - "SERVICETASKFIELDS": { - "TITLE": "クラス項目", - "DESCRIPTION": "項目拡張" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE": { - "SERVICETASKRESULTVARIABLE": { - "TITLE": "結果変数", - "DESCRIPTION": "サービスタスクの結果を格納するプロセス変数の名前" - } - }, - "ASYNCPACKAGE": { - "ISASYNC": { - "TITLE": "非同期", - "DESCRIPTION": "非同期で実行されるタスク。" - }, - "ISEXCLUSIVE": { - "TITLE": "排他", - "DESCRIPTION": "排他的に実行される非同期タスク" - } - }, - "MAILTASKHEADERSPACKAGE": { - "MAILTASKHEADERS": { - "TITLE": "ヘッダー", - "DESCRIPTION": "行分割したメールヘッダー。" - } - }, - "MAILTASKTOPACKAGE": { - "MAILTASKTO": { - "TITLE": "宛先", - "DESCRIPTION": "メールの受信者。カンマ区切りで指定された複数の受信者。" - } - }, - "MAILTASKFROMPACKAGE": { - "MAILTASKFROM": { - "TITLE": "差出人", - "DESCRIPTION": "メールの送信者。指定しない場合は規程のアドレスが使用されます。" - } - }, - "MAILTASKSUBJECTPACKAGE": { - "MAILTASKSUBJECT": { - "TITLE": "件名", - "DESCRIPTION": "メールの表題。" - } - }, - "MAILTASKCCPACKAGE": { - "MAILTASKCC": { - "TITLE": "同報(CC)", - "DESCRIPTION": "メールの同報先。カンマ区切りで指定された複数の受信者。" - } - }, - "MAILTASKBCCPACKAGE": { - "MAILTASKBCC": { - "TITLE": "同報(BCC)", - "DESCRIPTION": "メールの同報先(秘匿)。カンマ区切りで指定された複数の受信者。" - } - }, - "MAILTASKTEXTPACKAGE": { - "MAILTASKTEXT": { - "TITLE": "テキスト", - "DESCRIPTION": "リッチテキストメールに対応していない受信者のためのプレーンテキストのメールの本文。HTMLと組み合わせて利用できます。対応していない場合はテキストのみのバージョンが表示されます。" - }, - "MAILTASKTEXTVAR": { - "TITLE": "テキスト変数", - "DESCRIPTION": "プレーンテキストの内容が保存されるケース変数。HTMLと組み合わせて利用できます。対応していない場合はテキストのみのバージョンが表示されます。" - } - }, - "MAILTASKHTMLPACKAGE": { - "MAILTASKHTML": { - "TITLE": "HTML", - "DESCRIPTION": "メール本文に含まれるHTML断片。" - }, - "MAILTASKHTMLVAR": { - "TITLE": "HTML変数", - "DESCRIPTION": "リッチテキストの内容が保存されるケース変数。" - } - }, - "MAILTASKCHARSETPACKAGE": { - "MAILTASKCHARSET": { - "TITLE": "文字セット", - "DESCRIPTION": "非英語圏のユーザーのためにメールの文字セットを変更することができます。" - } - }, - "TEXTPACKAGE": { - "TEXT": { - "TITLE": "テキスト", - "DESCRIPTION": "アノテーションのテキスト。" - } - }, - "FORMREFERENCEPACKAGE": { - "FORMREFERENCE": { - "TITLE": "フォーム参照", - "DESCRIPTION": "フォームへの参照" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONTABLEREFERENCE": { - "TITLE": "デシジョンテーブル参照", - "DESCRIPTION": "デシジョンテーブルへの参照を設定" - } - }, - "DECISIONTASKDECISIONSERVICEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONSERVICEREFERENCE": { - "TITLE": "デシジョンサービス参照", - "DESCRIPTION": "デシジョンサービスへの参照を設定" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE": { - "DECISIONTASKTHROWERRORONNOHITS": { - "TITLE": "ルールがヒットしない場合はエラー", - "DESCRIPTION": "デシジョンテーブル上のルールにヒットせず結果が得られない場合はエラーとする。" - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE": { - "DECISIONTASKFALLBACKTODEFAULTTENANT": { - "TITLE": "規定のテナントにフォールバック", - "DESCRIPTION": "テナント付きの条件で失敗した場合は既定の条件で判断の定義を検索。" - } - }, - "HTTPTASKREQUESTMETHODPACKAGE": { - "HTTPTASKREQUESTMETHOD": { - "TITLE": "リクエストメソッド", - "DESCRIPTION": "リクエストメソッド(GET、POST、PUTなど)" - } - }, - "HTTPTASKREQUESTURLPACKAGE": { - "HTTPTASKREQUESTURL": { - "TITLE": "リクエストURL", - "DESCRIPTION": "リクエストURL(http://flowable.orgなど)" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE": { - "HTTPTASKREQUESTHEADERS": { - "TITLE": "リクエストヘッダー", - "DESCRIPTION": "行分割されたHTTPリクエストヘッダー(Content-Type: application/jsonなど)" - } - }, - "HTTPTASKREQUESTBODYPACKAGE": { - "HTTPTASKREQUESTBODY": { - "TITLE": "リクエストボディ", - "DESCRIPTION": "リクエストボディ(${sampleBody}など)" - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE": { - "HTTPTASKREQUESTBODYENCODING": { - "TITLE": "リクエストボディエンコーディング", - "DESCRIPTION": "リクエストボディのエンコーディング(UTF-8など)" - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE": { - "HTTPTASKREQUESTTIMEOUT": { - "TITLE": "リクエストタイムアウト", - "DESCRIPTION": "ミリ秒単位のリクエストのタイムアウト設定(5000など)" - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE": { - "HTTPTASKDISALLOWREDIRECTS": { - "TITLE": "リダイレクト拒否", - "DESCRIPTION": "HTTPリダイレクトを拒否するフラグ" - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE": { - "HTTPTASKFAILSTATUSCODES": { - "TITLE": "失敗ステータスコード", - "DESCRIPTION": "再実行のためのHTTPレスポンスのステータスコードのカンマ区切りリスト(400、5XXなど)" - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE": { - "HTTPTASKHANDLESTATUSCODES": { - "TITLE": "ステータスコードハンドル", - "DESCRIPTION": "無視するHTTPレスポンスのステータスコードのカンマ区切りリスト(404、3XXなど)" - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE": { - "HTTPTASKIGNOREEXCEPTION": { - "TITLE": "例外無視", - "DESCRIPTION": "例外を無視するフラグ。" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE": { - "HTTPTASKRESPONSEVARIABLENAME": { - "TITLE": "レスポンス変数", - "DESCRIPTION": "HTTPレスポンスを保存する変数。" - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE": { - "HTTPTASKSAVEREQUESTVARIABLES": { - "TITLE": "リクエスト変数の保存", - "DESCRIPTION": "リクエスト変数の保存のフラグ。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERS": { - "TITLE": "レスポンスステータス、ヘッダーの保存", - "DESCRIPTION": "リクエストステータス、ヘッダーなどの保存のフラグ。" - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE": { - "HTTPTASKRESULTVARIABLEPREFIX": { - "TITLE": "結果変数接頭辞", - "DESCRIPTION": "実行変数の接頭辞。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT": { - "TITLE": "レスポンスを一時変数に保存", - "DESCRIPTION": "レスポンスを一時変数に保存するフラグ" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE": { - "HTTPTASKSAVERESPONSEASJSON": { - "TITLE": "レスポンスをJSON形式で保存", - "DESCRIPTION": "レスポンスを文字列ではなくJSON形式で保存するフラグ" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that when using parallel gateways multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the process is faster." - } - }, - "EVENTREGISTRYPACKAGE": { - "EVENTKEY": { - "TITLE": "イベントキー", - "DESCRIPTION": "イベントキーの定義" - }, - "EVENTNAME": { - "TITLE": "イベント名", - "DESCRIPTION": "イベント名の定義" - }, - "EVENTINPARAMETERS": { - "TITLE": "イベントペイロードへのマッピング", - "DESCRIPTION": "イベントペイロード属性にプロセス変数をマッピング" - }, - "EVENTOUTPARAMETERS": { - "TITLE": "イベントペイロードからのマッピング", - "DESCRIPTION": "プロセス変数にイベントペイロード属性をマッピング" - }, - "EVENTCORRELATIONPARAMETERS": { - "TITLE": "相関パラメーター", - "DESCRIPTION": "相関パラメーターの定義" - }, - "CHANNELKEY": { - "TITLE": "チャンネルキー", - "DESCRIPTION": "チャンネルキーの定義" - }, - "CHANNELNAME": { - "TITLE": "チャンネル名", - "DESCRIPTION": "チャンネル名の定義" - }, - "CHANNELTYPE": { - "TITLE": "チャンネルタイプ", - "DESCRIPTION": "チャンネルタイプの定義" - }, - "CHANNELDESTINATION": { - "TITLE": "チャンネルの宛先", - "DESCRIPTION": "チャンネルの宛先の定義" - }, - "KEYDETECTIONFIXEDVALUE": { - "TITLE": "イベントキー固定値", - "DESCRIPTION": "イベントキー固定値の定義" - }, - "KEYDETECTIONJSONFIELD": { - "TITLE": "イベントキーJSONフィールド", - "DESCRIPTION": "JSONフィールドによるイベントキー検知の定義" - }, - "KEYDETECTIONJSONPOINTER": { - "TITLE": "イベントキーJSONポインター", - "DESCRIPTION": "JSONポインター式によるイベントキー検知の定義" - } - }, - "EXTERNALWORKERJOBPACKAGE": { - "TOPIC": { - "TITLE": "ジョブトピック", - "DESCRIPTION": "外部ワーカーが使用する可能性があるジョブトピック" - } - }, - "CASETASKCASEREFERENCEPACKAGE": { - "CASETASKCASEREFERENCE": { - "TITLE": "ケース参照", - "DESCRIPTION": "ケース参照を設定" - } - }, - "PROCESSTASKPROCESSREFERENCEPACKAGE": { - "PROCESSTASKPROCESSREFERENCE": { - "TITLE": "プロセス参照", - "DESCRIPTION": "プロセス参照を設定" - } - }, - "FALLBACKTODEFAULTTENANTPACKAGE": { - "FALLBACKTODEFAULTTENANT": { - "TITLE": "規定のテナントにフォールバック", - "DESCRIPTION": "指定されたテナントにキーが見つからなかった場合は既定のテナントを使用する" - } - }, - "PROCESSTASKINPARAMETERSPACKAGE": { - "PROCESSTASKINPARAMETERS": { - "TITLE": "引数", - "DESCRIPTION": "入力パラメータの定義" - } - }, - "PROCESSTASKOUTPARAMETERSPACKAGE": { - "PROCESSTASKOUTPARAMETERS": { - "TITLE": "返値", - "DESCRIPTION": "出力パラメータの定義" - } - }, - "CASETASKINPARAMETERSPACKAGE": { - "CASETASKINPARAMETERS": { - "TITLE": "引数", - "DESCRIPTION": "入力パラメータの定義" - } - }, - "CASETASKOUTPARAMETERSPACKAGE": { - "CASETASKOUTPARAMETERS": { - "TITLE": "返値", - "DESCRIPTION": "出力パラメータの定義" - } - }, - "IDVARIABLENAMEPACKAGE": { - "IDVARIABLENAME": { - "TITLE": "ID変数", - "DESCRIPTION": "開始したインスタンスのIDをこの変数に保存" - } - }, - "TIMEREXPRESSIONPACKAGE": { - "TIMEREXPRESSION": { - "TITLE": "タイマー式", - "DESCRIPTION": "ISO-8601仕様の文字列もしくはjava.util.Date" - } - }, - "TIMERSTARTTRIGGERPACKAGE": { - "TIMERSTARTTRIGGERSOURCEREF": { - "TITLE": "開始トリガー計画アイテム", - "DESCRIPTION": "タイマーを開始させる標準イベントを設定した計画アイテムへの参照(オプショナル)" - }, - "TRANSITIONEVENT": { - "TITLE": "開始トリガー遷移イベント", - "DESCRIPTION": "遷移イベントのタイプ。開始トリガー計画アイテムが設定されている場合にのみ使用する" - } - }, - "DECISIONTASKDECISIONREFERENCEPACKAGE": { - "DECISIONTASKDECISIONREFERENCE": { - "TITLE": "判断参照", - "DESCRIPTION": "判断参照の設定" - } - }, - "DECISIONTASKDECISIONREFERENCEPACKAGE": { - "DECISIONTASKDECISIONREFERENCE": { - "TITLE": "判断参照", - "DESCRIPTION": "判断参照の設定" - } - }, - "IFPARTCONDITIONPACKAGE": { - "IFPARTCONDITION": { - "TITLE": "条件", - "DESCRIPTION": "" - } - }, - "TRIGGERMODEPACKAGE": { - "TRIGGERMODE": { - "TITLE": "トリガーモード", - "DESCRIPTION": "メモリー付き(標準)もしくはメモリーなし(イベント時)のどちらに見張り条件を評価するかを決定標準では見張り条件が部分的に充足した場合その結果を保持します。後続の評価は条件が同じ条件を再評価する際に保持された値を使います。イベント時、の設定の場合全部の条件を評価しすべてがtrueの場合のみ充足されます。充足されない場合は途中結果はすべて破棄されます。" - } - }, - "AUTOCOMPLETEPACKAGE": { - "AUTOCOMPLETEENABLED": { - "TITLE": "自動完了", - "DESCRIPTION": "子がすべて完了した時に自動的に完了となることを示すフラグ" - }, - "AUTOCOMPLETECONDITION": { - "TITLE": "自動完了条件", - "DESCRIPTION": "ステージが自動完了となる条件を決定する式" - } - }, - "REQUIREDRULEPACKAGE": { - "REQUIREDENABLED": { - "TITLE": "必須", - "DESCRIPTION": "ステージ、タスク、マイルストーンなどが親ステージの完了判定時に要求されるかどうかを示すフラグ。標準ではfalseに設定。" - }, - "REQUIREDRULECONDITION": { - "TITLE": "必須ルール", - "DESCRIPTION": "ステージ、タスク、マイルストーンが親ステージの完了判定時に要求されるかどうかを判定する式。" - } - }, - "REPETITIONRULEPACKAGE": { - "REPETITIONENABLED": { - "TITLE": "反復", - "DESCRIPTION": "反復が有効化されているかを示すフラグ" - }, - "REPETITIONRULECONDITION": { - "TITLE": "反復ルール", - "DESCRIPTION": "プランアイテムの新しいインスタンスを生成するかを判定する式" - }, - "REPETITIONCOUNTERVARIABLENAME": { - "TITLE": "反復カウンター変数", - "DESCRIPTION": "反復したインスタンスの数を計測するローカル変数の名前。既定の値は\"repetitionCounter\"。" - } - }, - "MANUALACTIVATIONRULEPACKAGE": { - "MANUALACTIVATIONENABLED": { - "TITLE": "マニュアル有効化", - "DESCRIPTION": "タスクやステージがマニュアルで有効化する必要があるかを示すフラグ。既定の値はfalse。" - }, - "MANUALACTIVATIONRULECONDITION": { - "TITLE": "マニュアル有効化ルール", - "DESCRIPTION": "タスクやステージがマニュアルで有効化される必要があるかどうかを判定する式。" - } - }, - "COMPLETIONNEUTRALRULEPACKAGE": { - "COMPLETIONNEUTRALENABLED": { - "TITLE": "完了中立", - "DESCRIPTION": "プランアイテムが完了中立(親ステージの完了に影響しない)であることを示すフラグ。既定の値はfalse。" - }, - "COMPLETIONNEUTRALRULECONDITION": { - "TITLE": "完了中立ルール", - "DESCRIPTION": "プランアイテムが完了中立であるかを判定する式。" - } - }, - "PLANITEMLIFECYCLELISTENERSPACKAGE": { - "PLANITEMLIFECYCLELISTENERS": { - "TITLE": "ライフサイクルリスナー", - "DESCRIPTION": "プランアイテムのライフサイクルイベントのリスナー" - } - }, - "DISPLAYORDERPACKAGE": { - "DISPLAYORDER": { - "TITLE": "表示順", - "DESCRIPTION": "ステージ概要表示の際に他のステージの値と比較して表示順を決定するための値。" - } - }, - "INCLUDEINSTAGEOVERVIEWPACKAGE": { - "INCLUDEINSTAGEOVERVIEW": { - "TITLE": "概要表示に含む", - "DESCRIPTION": "ステージの概要表示に出すかどうかを示す" - } - }, - "MILESTONEVARIABLEPACKAGE": { - "MILESTONEVARIABLE": { - "TITLE": "マイルストーン変数", - "DESCRIPTION": "設定されている場合この名前の変数には毎留守尾トーンに到達した時点でtrueの値がセットされる" - } - }, - "SCRIPTFORMATPACKAGE": { - "SCRIPTFORMAT": { - "TITLE": "スクリプトフォーマット", - "DESCRIPTION": "スクリプトタスクのフォーマット(Javascript、Groovyなど)" - } - }, - "SCRIPTTEXTPACKAGE": { - "SCRIPTTEXT": { - "TITLE": "スクリプト", - "DESCRIPTION": "スクリプトタスクのテキスト" - } - }, - "TRANSITIONEVENTPACKAGE": { - "TRANSITIONEVENT": { - "TITLE": "遷移イベントタイプ", - "DESCRIPTION": "遷移イベントのタイプ" - } - }, - "AVAILABLECONDITIONPACKAGE": { - "AVAILABLECONDITION": { - "TITLE": "利用可能条件", - "DESCRIPTION": "イベントリスナーが利用可能になるための条件式。" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE": { - "SERVICETASKSTORERESULTVARIABLETRANSIENT": { - "TITLE": "結果変数を一時的に保存", - "DESCRIPTION": "式の結果をデータベーストランザクションの完了時に永続化させないフラグ" - } - } - }, - "STENCILS": { - "GROUPS": { - "DIAGRAM": "ダイヤグラム", - "CONTAINERS": "コンテナー", - "ACTIVITIES": "アクティビティ", - "EVENTLISTENERS": "イベントリスナー", - "SENTRIES": "見張り", - "CONNECTORS": "コネクター" - }, - "CMMNDIAGRAM": { - "TITLE": "CMMNダイアグラム", - "DESCRIPTION": "CMMN2.0のダイアグラム" - }, - "CASEPLANMODEL": { - "TITLE": "ケースプランモデル", - "DESCRIPTION": "ケースプランモデル" - }, - "STAGE": { - "TITLE": "ステージ", - "DESCRIPTION": "ステージ" - }, - "TASK": { - "TITLE": "タスク", - "DESCRIPTION": "マニュアルタスク" - }, - "HUMANTASK": { - "TITLE": "ヒューマンタスク", - "DESCRIPTION": "特定の人に割当られたマニュアルタスク" - }, - "SERVICETASK": { - "TITLE": "サービスタスク", - "DESCRIPTION": "サービスロジックによる自動タスク" - }, - "DECISIONTASK": { - "TITLE": "判断タスク", - "DESCRIPTION": "DMNの判断を呼び出すタスク" - }, - "HTTPTASK": { - "TITLE": "HTTPタスク", - "DESCRIPTION": "HTTPタスク" - }, - "MAILTASK": { - "TITLE": "メールタスク", - "DESCRIPTION": "メールタスク" - }, - "SCRIPTTASK": { - "TITLE": "スクリプトタスク", - "DESCRIPTION": "スクリプトロジックによる自動タスク" - }, - "SENDEVENTTASK": { - "TITLE": "イベント送信タスク", - "DESCRIPTION": "イベント送信タスク" - }, - "EXTERNALWORKERTASK": { - "TITLE": "外部ワーカータスク", - "DESCRIPTION": "外部ワーカーによって実行されるジョブを作るタスク" - }, - "MILESTONE": { - "TITLE": "マイルストーン", - "DESCRIPTION": "マイルストーン" - }, - "CASETASK": { - "TITLE": "ケースタスク", - "DESCRIPTION": "新しいインスタンスを開始するケース定義への参照" - }, - "PROCESSTASK": { - "TITLE": "プロセスタスク", - "DESCRIPTION": "新しいインスタンスを開始するプロセス定義への参照" - }, - "EVENTLISTENER": { - "TITLE": "イベントリスナー", - "DESCRIPTION": "一般的なイベントリスナー" - }, - "TIMEREVENTLISTENER": { - "TITLE": "タイマーイベントリスナー", - "DESCRIPTION": "タイマートリガー付きのイベントリスナー" - }, - "USEREVENTLISTENER": { - "TITLE": "ユーザーイベントリスナー", - "DESCRIPTION": "ユーザーイベントのリスナー" - }, - "ENTRYCRITERION": { - "TITLE": "入口基準", - "DESCRIPTION": "入口基準を定義する見張り" - }, - "EXITCRITERION": { - "TITLE": "出口基準", - "DESCRIPTION": "出口基準を定義する見張り" - }, - "ASSOCIATION": { - "TITLE": "関連", - "DESCRIPTION": "プランアイテムと見張りの関連" - } - } - }, - "EDITOR": { - "POPUP": { - "UNSAVED-CHANGES": { - "TITLE": "保存していない変更があります", - "DESCRIPTION": "未保存の変更内容をどうしますか?", - "ACTION": { - "SAVE": "変更を保存", - "DISCARD": "変更を破棄", - "CONTINUE": "編集の続行" - } - } - } - }, - "PROCESS-LIST": { - "TITLE": "ビジネスプロセスモデル", - "SEARCH-PLACEHOLDER": "検索", - "ACTION": { - "CREATE": "プロセスの作成", - "IMPORT": "プロセスのインポート" - }, - "FILTER": { - "PROCESSES": "プロセスモデル", - "PROCESSES-COUNT": "プロセスモデルが{{total}}個あります", - "PROCESSES-ONE": "プロセスモデルが1個あります", - "PROCESSES-EMPTY": "プロセスモデルはまだ作成されていません。プロセスモデル、ユーザーフォームを作成しそれらをまとめてプロセスアプリを作成できます。最初のステップはプロセスモデルの作成です:", - "PROCESSES-BPMN-HINT": "BPMNビジュアルエディターを使ってBPMNモデルを作成。", - "PROCESSES-BPMN-IMPORT-HINT": "既存のBPMNモデルをインポートすることもできます。", - "FILTER-TEXT": "条件“{{filterText}}”", - "FILTER-TEXT-EMPTY": "条件“{{filterText}}”にあうプロセスモデルはありません", - "RECENT": "新着", - "RECENT-COUNT": "{{total}}個の最近使用されたモデル", - "RECENT-ONE": "最近利用されたモデル", - "RECENT-EMPTY": "最近利用されたモデルはありません。" - }, - "SORT": { - "MODIFIED-ASC": "作成日 昇順", - "MODIFIED-DESC": "作成日 降順", - "NAME-ASC": "名前 昇順", - "NAME-DESC": "名前 降順" - } - }, - "CASE-LIST": { - "TITLE": "ケースモデル", - "SEARCH-PLACEHOLDER": "検索", - "ACTION": { - "CREATE": "ケースの作成", - "IMPORT": "ケースのインポート" - }, - "FILTER": { - "CASES": "ケースモデル", - "CASES-COUNT": "ケースモデルが{{total}}個あります", - "CASES-ONE": "ケースモデルが1個あります", - "CASES-EMPTY": "ケースモデルはまだ作成されていません。ケースモデル、ユーザーフォームを作成しそれらをまとめてアプリを作成できます。最初のステップはケースモデルの作成です:", - "CASES-CMMN-HINT": "CMMNビジュアルエディターを使ってCMMNモデルを作成", - "CASES-CMMN-IMPORT-HINT": "既存のCMMNモデルをインポートすることもできます。", - "FILTER-TEXT": "条件“{{filterText}}”", - "FILTER-TEXT-EMPTY": "条件“{{filterText}}”にあうケースモデルはありません。", - "RECENT": "新着", - "RECENT-COUNT": "{{total}}個の最近使用されたモデル", - "RECENT-ONE": "最近利用されたモデル", - "RECENT-EMPTY": "最近利用されたモデルはありません。" - }, - "SORT": { - "MODIFIED-ASC": "作成日 昇順", - "MODIFIED-DESC": "作成日 降順", - "NAME-ASC": "名前 昇順", - "NAME-DESC": "名前 降順" - } - }, - "FORMS-LIST": { - "TITLE": "フォーム", - "SEARCH-PLACEHOLDER": "検索", - "ACTION": { - "CREATE": "フォームの作成", - "CREATE-INLINE": "今すぐ新しいフォームを作成", - "SHOW-MORE": "さらに表示..." - }, - "FILTER": { - "FORMS": "フォーム", - "FORMS-COUNT": "フォームが{{total}}個あります。", - "FORMS-ONE": "フォームが1つあります。", - "FORMS-EMPTY": "フォームはまだありません。フォームの作成 をクリックして追加してください。", - "FILTER-TEXT": "条件“{{filterText}}”", - "FILTER-TEXT-EMPTY": "条件“{{filterText}}”にあうフォームはありません。" - }, - "SORT": { - "MODIFIED-ASC": "作成日 昇順", - "MODIFIED-DESC": "作成日 降順", - "NAME-ASC": "名前 昇順", - "NAME-DESC": "名前 降順" - } - }, - "DECISIONS-LIST": { - "TITLE": "判断", - "SEARCH-PLACEHOLDER": "検索", - "ACTION": { - "CREATE-DECISION-SERVICE": "デシジョンサービスの作成", - "CREATE": "デシジョンテーブルの作成", - "IMPORT": "デシジョンテーブルのインポート", - "CREATE-INLINE": "今すぐ新しいデシジョンテーブルを作成", - "SHOW-MORE": "さらに表示..." - }, - "FILTER": { - "DECISION-TABLES": "デシジョン テーブル", - "DECISION-TABLES-COUNT": "デシジョンテーブルが{{total}}個あります", - "DECISION-TABLES-ONE": "デシジョンテーブルが1個あります", - "DECISION-TABLES-EMPTY": "デシジョンテーブルはまだありません。デシジョンテーブルの作成 をクリックして追加してください。", - "FILTER-TEXT": "条件“{{filterText}}”", - "FILTER-TEXT-EMPTY": "条件“{{filterText}}”にあうデシジョンテーブルはありません", - "DECISION-SERVICES": "デシジョンサービス", - "DECISION-SERVICES-COUNT": "デシジョンサービスが{{total}}個あります", - "DECISION-SERVICES-ONE": "デシジョンサービスが1個あります", - "DECISION-SERVICES-EMPTY": "デシジョンサービスはまだありません。デシジョンサービスの作成 をクリックして追加してください。" - }, - "SORT": { - "MODIFIED-ASC": "作成日 昇順", - "MODIFIED-DESC": "作成日 降順", - "NAME-ASC": "名前 昇順", - "NAME-DESC": "名前 降順" - } - }, - "APPS-LIST": { - "TITLE": "アプリ定義", - "SEARCH-PLACEHOLDER": "検索", - "ACTION": { - "CREATE": "アプリの作成", - "IMPORT": "アプリのインポート", - "SHOW-MORE": "さらに表示..." - }, - "FILTER": { - "APPS": "アプリ定義", - "APPS-COUNT": "アプリ定義が{{total}}個あります", - "APPS-ONE": "アプリ定義が1個あります", - "APPS-EMPTY": "アプリ定義はまだありません。アプリの作成 をクリックして追加してください。", - "FILTER-TEXT": "条件“{{filterText}}”", - "FILTER-TEXT-EMPTY": "条件“{{filterText}}”にあうアプリ定義はありません", - "NO-APPS": "バンドルされたプロセスモデルを公開してアプリ定義を作成できます。", - "NO-APPS-CALL-TO-ACTION": "今すぐアプリ定義を作成できます。", - "NO-APPS-NOTE": "使用する準備ができたら公開することを忘れずに" - }, - "SORT": { - "MODIFIED-ASC": "作成日 昇順", - "MODIFIED-DESC": "作成日 降順", - "NAME-ASC": "名前 昇順", - "NAME-DESC": "名前 降順" - } - }, - "PROCESS": { - "NAME": "モデル名", - "KEY": "モデルキー", - "DESCRIPTION": "説明", - "VERSION-COMMENT": "バージョンコメント", - "ACTION": { - "DETAILS": "詳細の表示", - "EDIT": "モデル属性の修正", - "DUPLICATE": "このモデルの複製", - "EXPORT_BPMN20": "BPMN 2.0 エクスポート", - "DELETE": "このモデルの削除", - "CREATE-CONFIRM": "新規モデルの作成", - "DUPLICATE-CONFIRM": "モデルの複製", - "OPEN-IN-EDITOR": "ビジュアルエディター", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "プロセスモデルの削除", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用", - "FAVORITE": "モデルのブックマーク" - }, - "DETAILS": { - "HISTORY-TITLE": "履歴", - "LAST-UPDATED-BY": "{{lastUpdatedBy}}が更新 - {{lastUpdated | dateformat}}", - "CREATED-BY": "{{createdBy}}が作成", - "NO-DESCRIPTION": "このモデルには説明がありません。追加するためにモデル属性を編集" - }, - "POPUP": { - "CREATE-TITLE": "新しいビジネスプロセスモデルの作成", - "DUPLICATE-TITLE": "ビジネスプロセスモデルの複製", - "CREATE-DESCRIPTION": "新しいモデルに名前をつけてください。同時に説明を加えることもできます。", - "DUPLICATE-DESCRIPTION": "新しいモデルの名前を変えてください。同時に説明を加えることもできます。", - "EDIT-DESCRIPTION": "以下のモデルの属性を変更し、保存を押してモデルを更新。", - "DELETE-DESCRIPTION": "プロセスモデル“{{name}}”を削除しますか?", - "EDIT-TITLE": "モデル詳細の編集", - "DELETE-TITLE": "モデルの削除", - "DELETE-LOADING-RELATIONS": "モデルの使用状況をチェック中...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "このモデルは削除できません。他のモデルから使用されています:", - "DELETE-RELATIONS-DESCRIPTION": "このモデルは削除できません。他のモデルから使用されています:", - "DELETE-PROCESS-RELATION": "プロセスモデル", - "DELETE-FORM-RELATION": "フォームモデル", - "DELETE-APP-RELATION": "アプリモデル", - "IMPORT-DESCRIPTION": ".bpmnもしくは.bpmn20.xmlの拡張子を持つBPMN XML定義ファイルをドロップするか選択してください。", - "IMPORT-TITLE": "プロセスモデルのインポート", - "USE-AS-NEW-TITLE": "新しいバージョンとして使用", - "USE-AS-NEW-DESCRIPTION": "新しいバージョン“{{name}}”を作成するためにバージョン{{version}}を使いますか?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "選択したバージョンへアプリモデルを完全に復元することはできません: いくつかの参照モデルが削除されています。アプリモデルを更新してください。見つからないモデル:", - "USE-AS-NEW-UNRESOLVED-MODEL": "内部ID“{{id}}”のモデル“{{name}}” 作成者“{{createdBy}}”", - "SHARED-WITH": "共有先", - "PERMISSION": "権限", - "ACTIONS": "アクション", - "IMPORT": { - "DROPZONE": ".bpmnもしくは.bpmn20.xmlのBPMN XMLファイルをドロップ", - "CANCEL-UPLOAD": "アップロードのキャンセル", - "ERROR": "BPMN XMLファイル処理中のエラー", - "NO-DROP": "ドラッグ&ドロップはサポートされていません" - } - }, - "ALERT": { - "EDIT-CONFIRM": "更新されたモデル" - }, - "ERROR": { - "NOT-FOUND": "リクエストされたモデルは存在しません。" - } - }, - "SUBPROCESS": { - "NAME": "サブプロセス名", - "DESCRIPTION": "説明", - "ACTION": { - "CREATE-CONFIRM": "新規サブプロセスの作成" - }, - "POPUP": { - "CREATE-TITLE": "新規サブプロセスの作成", - "CREATE-DESCRIPTION": "新しいサブプロセスに名前をつけてください。同時に説明を加えることもできます。" - } - }, - "CASE": { - "NAME": "モデル名", - "KEY": "モデルキー", - "DESCRIPTION": "説明", - "VERSION-COMMENT": "バージョンコメント", - "ACTION": { - "DETAILS": "詳細の表示", - "EDIT": "モデル属性の修正", - "DUPLICATE": "このモデルの複製", - "EXPORT_CMMN": "CMMN 1.1 エクスポート", - "DELETE": "このモデルの削除", - "CREATE-CONFIRM": "新規モデルの作成", - "DUPLICATE-CONFIRM": "モデルの複製", - "OPEN-IN-EDITOR": "ビジュアルエディター", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "ケースモデルの削除", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用", - "FAVORITE": "モデルのブックマーク" - }, - "DETAILS": { - "HISTORY-TITLE": "履歴", - "LAST-UPDATED-BY": "{{lastUpdatedBy}}が更新 - {{lastUpdated | dateformat}}", - "CREATED-BY": "{{createdBy}}が作成", - "NO-DESCRIPTION": "このモデルには説明がありません。追加するためにモデル属性を編集" - }, - "POPUP": { - "CREATE-TITLE": "新規ケースモデルの作成", - "DUPLICATE-TITLE": "ケースモデルの複製", - "CREATE-DESCRIPTION": "新しいモデルに名前をつけてください。同時に説明を加えることもできます。", - "DUPLICATE-DESCRIPTION": "新しいモデルの名前を変えてください。同時に説明を加えることもできます。", - "EDIT-DESCRIPTION": "以下のモデルの属性を変更し、保存を押してモデルを更新。", - "DELETE-DESCRIPTION": "プロセスモデル“{{name}}”を削除しますか?", - "EDIT-TITLE": "モデル詳細の編集", - "DELETE-TITLE": "モデルの削除", - "DELETE-LOADING-RELATIONS": "モデルの使用状況をチェック中...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "このモデルは削除できません。他のモデルから使用されています:", - "DELETE-RELATIONS-DESCRIPTION": "このモデルは削除できません。他のモデルから使用されています:", - "DELETE-PROCESS-RELATION": "ケースモデル", - "DELETE-FORM-RELATION": "フォームモデル", - "DELETE-APP-RELATION": "アプリモデル", - "IMPORT-DESCRIPTION": ".cmmnもしくは.cmmn.xmlの拡張子を持つCMMN XML定義ファイルをドロップするか選択してください", - "IMPORT-TITLE": "ケースモデルのインポート", - "USE-AS-NEW-TITLE": "新しいバージョンとして使用", - "USE-AS-NEW-DESCRIPTION": "新しいバージョン“{{name}}”を作成するためにバージョン{{version}}を使いますか?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "選択したバージョンへアプリモデルを完全に復元することはできません: いくつかの参照モデルが削除されています。アプリモデルを更新してください。見つからないモデル:", - "USE-AS-NEW-UNRESOLVED-MODEL": "内部ID“{{id}}”のモデル“{{name}}” 作成者“{{createdBy}}”", - "SHARED-WITH": "共有先", - "PERMISSION": "権限", - "ACTIONS": "アクション", - "IMPORT": { - "DROPZONE": ".cmmnもしくは.cmmn.xmlのBPMN XMLファイルをドロップ", - "CANCEL-UPLOAD": "アップロードのキャンセル", - "ERROR": "CMMN XMLファイル処理中のエラー", - "NO-DROP": "ドラッグ&ドロップはサポートされていません" - } - }, - "ALERT": { - "EDIT-CONFIRM": "更新されたモデル" - }, - "ERROR": { - "NOT-FOUND": "リクエストされたモデルは存在しません。" - } - }, - "FORM": { - "NAME": "フォーム名", - "KEY": "フォームキー", - "DESCRIPTION": "説明", - "ACTION": { - "DETAILS": "詳細の表示", - "EDIT": "モデル属性の修正", - "DELETE": "このフォームの削除", - "CREATE-CONFIRM": "新規フォームの作成", - "DUPLICATE": "このフォームの複製", - "DUPLICATE-CONFIRM": "フォームの複製", - "OPEN-IN-EDITOR": "フォームエディター", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "フォームの削除", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用" - }, - "DETAILS": { - "HISTORY-TITLE": "履歴", - "LAST-UPDATED-BY": "{{lastUpdatedBy}}が更新 - {{lastUpdated | dateformat}}", - "CREATED-BY": "{{createdBy}}が作成" - }, - "POPUP": { - "CREATE-TITLE": "新規フォームの作成", - "DUPLICATE-TITLE": "フォームの複製", - "CREATE-DESCRIPTION": "新しいフォームに名前をつけてください。同時に説明を加えることもできます。", - "DUPLICATE-DESCRIPTION": "新しいフォームに名前をつけてください。同時に説明を加えることもできます。", - "SAVE-FORM-TITLE": "フォームの保存", - "EDIT-DESCRIPTION": "以下のフォームの属性を変更し、保存を押してフォームを更新。", - "DELETE-DESCRIPTION": "フォーム“{{name}}”を削除しますか?", - "EDIT-TITLE": "フォーム詳細の編集", - "DELETE-TITLE": "フォームの削除", - "USE-AS-NEW-TITLE": "新しいバージョンとして使用", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用", - "USE-AS-NEW-DESCRIPTION": "新しいバージョン“{{name}}”を作成するためにバージョン{{version}}を使いますか?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "選択したバージョンへアプリモデルを完全に復元することはできません: いくつかの参照モデルが削除されています。アプリモデルを更新してください。見つからないモデル:", - "USE-AS-NEW-UNRESOLVED-MODEL": "内部ID“{{id}}”のモデル“{{name}}” 作成者“{{createdBy}}”" - } - }, - "DECISION-SERVICE": { - "NAME": "デシジョンサービス名", - "KEY": "デシジョンサービスキー", - "DESCRIPTION": "説明", - "POPUP": { - "CREATE-TITLE": "新規デシジョンサービスの作成", - "CREATE-DESCRIPTION": "新しいデシジョンサービスに名前をつけてください。同時に説明を加えることもできます。" - } - }, - "DECISION-TABLE": { - "NAME": "デシジョンテーブル名", - "KEY": "デシジョンテーブルキー", - "DESCRIPTION": "説明", - "VERSION-COMMENT": "バージョンコメント", - "HIT-POLICY": "ヒットポリシー:", - "ACTION": { - "DETAILS": "詳細の表示", - "EDIT": "モデル属性の修正", - "SHARE": "デシジョンテーブルの共有", - "DELETE": "デシジョンテーブルの削除", - "ADD-COMMENT": "+ コメントの追加", - "CREATE-CONFIRM": "新規デシジョンテーブルの作成", - "OPEN-IN-EDITOR": "デシジョンテーブルエディター", - "EXPORT": "デシジョンテーブルのエクスポート", - "DELETE-CONFIRM": "デシジョンテーブルの削除", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用", - "FAVORITE": "デシジョンテーブルのブックマーク", - "DUPLICATE": "デシジョンテーブルの複製" - }, - "DETAILS": { - "HISTORY-TITLE": "履歴", - "COMMENTS-TITLE": "コメント", - "LAST-UPDATED-BY": "{{lastUpdatedBy}}が更新 - {{lastUpdated | dateformat}}", - "CREATED-BY": "{{createdBy}}が作成" - }, - "HIT-POLICIES": { - "FIRST": "初回(First)", - "ANY": "任意(Any)", - "UNIQUE": "固有(Unique)", - "PRIORITY": "優先度", - "RULE ORDER": "ルール順", - "OUTPUT ORDER": "出力順", - "COLLECT": "収集(Collect)" - }, - "COLLECT-OPERATORS": { - "SUM": "合計(Sum)", - "MIN": "最小(Min)", - "MAX": "最大(Max)", - "COUNT": "個数(Count)" - }, - "POPUP": { - "CREATE-TITLE": "新規デシジョンテーブルの作成", - "CREATE-DESCRIPTION": "新しいデシジョンテーブルに名前をつけてください。同時に説明を加えることもできます。", - "SAVE-DESCRIPTION": "新しいデシジョンテーブルに名前とユニークキーをつけてください。同時に説明を加えることもできます。", - "DUPLICATE-TITLE": "デシジョンテーブルの複製", - "DUPLICATE-DESCRIPTION": "新しいデシジョンテーブルに名前をつけてください。同時に説明を加えることもできます。", - "DELETE-TITLE": "デシジョンテーブルの削除", - "DELETE-DESCRIPTION": "デシジョンテーブル“{{name}}”を削除しますか?", - "SAVE-DECISION-TABLE-TITLE": "デシジョンテーブルの保存", - "IMPORT-DESCRIPTION": ".dmnもしくは.dmn.xmlの拡張子を持つDMN XML定義ファイルをドロップするか選択してください。", - "IMPORT-TITLE": "DMNモデルのインポート", - "IMPORT": { - "DROPZONE": ".dmnもしくは.dmn.xmlのDMN XMLファイルをドロップ", - "CANCEL-UPLOAD": "アップロードのキャンセル", - "ERROR": "DMN XMLファイル処理中のエラー", - "NO-DROP": "ドラッグ&ドロップはサポートされていません" - }, - "USE-AS-NEW-TITLE": "新しいバージョンとして使用", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用", - "USE-AS-NEW-DESCRIPTION": "新しいバージョン“{{name}}”を作成するためにバージョン{{version}}を使いますか?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "選択したバージョンへアプリモデルを完全に復元することはできません: いくつかの参照モデルが削除されています。アプリモデルを更新してください。見つからないモデル:", - "USE-AS-NEW-UNRESOLVED-MODEL": "内部ID“{{id}}”のモデル“{{name}}” 作成者“{{createdBy}}”", - "FORCE-DMN-11": "DMN1.1を強制" - }, - "ALERT": { - "FAVORITE-CONFIRM": "デシジョンテーブルをブックマークしました", - "UN-FAVORITE-CONFIRM": "デシジョンテーブルのブックマークを解除しました" - } - }, - "APP": { - "NAME": "アプリ定義名", - "KEY": "アプリ定義キー", - "DESCRIPTION": "説明", - "ICON": "アイコン", - "THEME": "テーマ", - "GROUPS-ACCESS": "グループアクセス カンマ区切り", - "USERS-ACCESS": "ユーザーアクセス カンマ区切り", - "ACTION": { - "DETAILS": "詳細の表示", - "EDIT": "アプリ定義属性の修正", - "DUPLICATE": "このアプリケーションの複製", - "SHARE": "アプリ定義の共有", - "DELETE": "アプリ定義の削除", - "CREATE-CONFIRM": "新規アプリ定義の作成", - "DUPLICATE-CONFIRM": "アプリ定義の複製", - "DELETE-CONFIRM": "アプリ定義の削除", - "USE-AS-NEW-VERSION": "新しいバージョンとして使用", - "OPEN-IN-EDITOR": "アプリエディター", - "PUBLISH": "公開", - "PUBLISH-CONFIRM": "アプリ定義の公開", - "SELECT-ICON": "アイコンの変更...", - "SELECT-THEME": "テーマの変更...", - "EDIT-MODELS": "取込モデルの編集", - "EXPORT-ZIP": "アプリ定義のエクスポート(zip)", - "EXPORT-BAR": "アプリ定義のエクスポート(bar)" - }, - "DETAILS": { - "TITLE": "アプリ定義詳細: {{name}}", - "HISTORY-TITLE": "履歴", - "MODELS-TITLE": "アプリ定義の取込モデル", - "LAST-UPDATED-BY": "{{lastUpdatedBy}}が更新 - {{lastUpdated | dateformat}}", - "CREATED-BY": "{{createdBy}}が作成", - "NO-DESCRIPTION": "アプリ定義はまだありません。追加するためにアプリ定義を編集", - "NO-MODELS-SELECTED": "このアプリにはモデルが選択されていません。" - }, - "TITLE": { - "SELECT-ICON": "アプリアイコンの選択", - "SELECT-THEME": "アプリカラーの選択", - "PREVIEW": "プレビュー" - }, - "POPUP": { - "CREATE-TITLE": "新規アプリ定義の作成", - "DUPLICATE-TITLE": "アプリ定義の複製", - "SAVE-APP-TITLE": "アプリ定義の保存", - "SAVE-APP-SAVE-SUCCESS": "アプリ定義の保存", - "CREATE-DESCRIPTION": "新しいアプリ定義に名前をつけてください。同時に説明を加えることもできます。", - "DUPLICATE-DESCRIPTION": "新しいアプリ定義に名前をつけてください。同時に説明を加えることもできます。", - "PUBLISH-TITLE": "アプリ定義の公開", - "PUBLISH-DESCRIPTION": "アプリ定義“{{name}}”を公開しますか?アプリ定義が新しくなると既存のワークフローアプリも更新されます。", - "PUBLISH-FIELD": "公開しますか?アプリ定義が新しくなると既存のワークフローアプリも更新されます。", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT": "プロセスモデル\"{{modelInAppName}}\"はデプロイ済みのアプリ\"{{conflictingAppName}}\"のプロセス\"{{conflictingModelName}}\"と同じID\"{{processDefinitionKey}}\"を持っています。プロセスモデルの\"ID\"属性を変更してください。", - "PUBLISH-ERROR-PROCESS-ALREADY-USED": "以下のプロセスモデルはすでに他のアプリで使用されています。問題はありませんか?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP": "アプリ", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS": "不正なアプリ: 重複するプロセス識別子が見つかりました。(“ID”属性の値を変更してください):", - "DELETE-TITLE": "アプリ定義の削除", - "DELETE-DESCRIPTION": "アプリ定義“{{name}}”を削除しますか?", - "DELETE-DESCRIPTION-WITH-RUNTIME": "アプリ定義“{{name}}”を削除しますか?アプリ定義がタスクのランディングページにデプロイされると、タスクアプリのランディングページからは削除されます。", - "DELETE-CASCADE-FALSE": "アプリ定義の現在のバージョン(v{{version}})のみを削除", - "DELETE-CASCADE-TRUE": "過去のバージョンもすべて削除", - "HAS-CUSTOM-STENCILITEM": "モデル\"{{modelName}}\"はカスタムステンシルを使用しています。このモデルはアプリ内で使うことができません。", - "HAS-VALIDATIONERROR": "モデル\"{{modelName}}\"は検証エラーがありアプリ定義に追加できません。エディターでモデルを開き検証エラーの詳細を確認してください。", - "IMPORT-DESCRIPTION": ".zipの拡張子を持つアプリ定義ファイルをドロップするか選択してください", - "IMPORT-TITLE": "アプリ定義モデルのインポート", - "IMPORT": { - "DROPZONE": "アプリ定義ファイル(zip)をドロップ", - "CANCEL-UPLOAD": "アップロードのキャンセル", - "RENEWIDM-IDS": "インポートのステップでユーザーとグループのIDを更新してください。これは異なるFlowable環境にアプリ定義をインポートする際に必要になることがあります。ターゲットとなる環境では適切なユーザーとグループにヒューマンタスクとユーザータスクを結びつけます。", - "ERROR": "アプリ定義ファイル処理中のエラー", - "NO-DROP": "ドラッグ&ドロップはサポートされていません" - }, - "INCLUDE-MODELS-TITLE": "アプリ定義の取込モデル" - }, - "ALERT": { - "DELETE-CONFIRM": "アプリ定義を削除", - "PUBLISH-CONFIRM": "アプリ定義が公開されました", - "PUBLISH-ERROR": "アプリ定義を公開できません。参照されているプロセスモデルが適正であることを確認してください。" - } - }, - "SHARE-INFO": { - "ACTION": { - "ADD": "別の人を追加" - } - }, - "FORM-BUILDER": { - "PALLETTE": { - "TEXT": "テキスト", - "MULTILINE-TEXT": "複数行テキスト", - "PASSWORD": "パスワード", - "NUMBER": "整数", - "CHECKBOX": "チェックボックス", - "DATE": "日付", - "DROPDOWN": "ドロップダウン", - "RADIO": "ラジオボタン", - "PEOPLE": "人", - "GROUP-OF-PEOPLE": "人のグループ", - "UPLOAD": "アップロード", - "EXPRESSION": "式", - "DECIMAL": "小数", - "HYPERLINK": "ハイパーリンク", - "SPACER": "スペーサー", - "HORIZONTAL-LINE": "水平線", - "HEADLINE": "ヘッドライン", - "HEADLINE-WITH-LINE": "ヘッドライン" - }, - "TABS": { - "GENERAL": "一般", - "OPTIONS": "選択", - "UPLOAD-OPTIONS": "アップロードのオプション", - "ADVANCED-OPTIONS": "拡張機能" - }, - "VERSION": "バージョン: {{version}}", - "LAST-UPDATED": "{{lastUpdatedBy}}が更新 - {{lastUpdated | dateformat}}", - "TITLE": { - "DESIGN": "設計", - "OUTCOME": "成果" - }, - "POPUP": { - "EDIT-TITLE": "フィールド“{{name}}”の編集", - "EXPRESSION-TITLE": "式の編集" - }, - "MESSAGE": { - "EMPTY-EXPRESSION": "(式の値がありません)", - "EXPRESSION-HELP": "登録済みの値を任意のフォームの中でテキストの一部としてフィールド“${myFieldId}”を参照して表示できます。", - "OPTIONS-EXPRESSION-HELP": "変数${optionsVariable}など式を使って動的に選択肢を設定することが可能です。式の結果はJavaオブジェクト(java.util.ListとOptionオブジェクト)かJSON表現である必要があります。" - }, - "LABEL": { - "FUNCTIONAL-GROUP": "グループを選択...", - "PERSON": "人を選択..." - }, - "COMPONENT": { - "LABEL": "ラベル:", - "OVERRIDEID": "IDを上書きしますか?", - "ID": "ID:", - "PLACEHOLDER": "プレースホルダー:", - "OPTIONS": "選択", - "RADIO-BUTTON-DEFAULT": "オプション1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION": "一つ選んでください...", - "DROPDOWN-EMPTY-VALUE-HELP": "これは空値オプションです。\"値なし\"もしくは\"空値\"を意味します。任意のフィールドにのみ設定可能です。", - "OPTIONS-EXPRESSION": "選択式:", - "OPTIONS-EXPRESSION-ENABLED": "選択式の有効化", - "REQUIRED": "必須", - "READONLY": "読み取り専用", - "EXPRESSION": "式", - "ADD-OPTION": "+ 選択肢の追加", - "UPLOAD-ALLOW-MULTIPLE": "複数ファイルのアップロードを許可", - "SIZE": "サイズ", - "MAX-LENGTH": "最大長:", - "MIN-LENGTH": "最小長:", - "PASSWORD-UNMASK-OPTION": "パスワードのマスキング設定", - "HYPERLINK-URL": "ハイパーリンクURL", - "REGEX-PATTERN": "正規表現", - "MASK": { - "TITLE": "入力マスク", - "EXAMPLES": { - "TITLE": "例:", - "NUMBER": "任意の数", - "LETTER": "任意の文字", - "NUMBERORLETTER": "任意の数もしくは文字", - "OPTIONAL": "マスクを任意に設定", - "PHONE": "電話番号" - } - } - }, - "OUTCOMES": { - "DESCRIPTION": "このタスクには複数の成果を定義できます。タスクの完了時に、ユーザーが成果の一つを選択できます。", - "NO-OUTCOMES-OPTION": "カスタムの成果を使わないでください。完了ボタンのみ表示されます。", - "OUTCOMES-OPTION": "このフォームにカスタムの成果を使用する。", - "POSSIBLE-OUTCOMES": "可能な成果", - "NEW-OUTCOME-PLACEHOLDER": "新しい成果を入力", - "ADD": "成果の追加", - "REMOVE": "削除" - } - }, - "DECISION-TABLE-EDITOR": { - "EMPTY-MESSAGES": { - "NO-VARIABLE-SELECTED": "未定義" - }, - "POPUP": { - "EXPRESSION-EDITOR": { - "INPUT-TITLE": "入力列の編集", - "INPUT-DESCRIPTION": "列の入力変数を選択", - "OUTPUT-TITLE": "出力列の編集", - "OUTPUT-DESCRIPTION": "既存の出力変数を選択するか、新しいものを作成", - "EXPRESSION-LABEL": "列ラベル:", - "EXPRESSION-PLACEHOLDER": "ラベルを入力", - "EXPRESSION-VARIABLE-NAME": "変数名:", - "EXPRESSION-VARIABLE-TYPE": "変数タイプ:", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER": "変数名を入力", - "OUTPUT-NEW-VARIABLE-ID": "変数ID:", - "OUTPUT-NEW-VARIABLE-TYPE": "変数タイプ:", - "COMPLEX-EXPRESSION-LABEL": "複雑な式:", - "ALLOWED-VALUES": "許可される値(任意):", - "OUTPUT-VALUES": "出力値", - "OUTPUT-VALUES-OPTIONAL": "(オプション)", - "OUTPUT-VALUES-NOT-OPTIONAL": "(優先度/出力順のために行をドラッグ)" - } - }, - "BUTTON-ACTIONS-LABEL": "アクション", - "BUTTON-ADD-INPUT-LABEL": "入力の追加", - "BUTTON-ADD-OUTPUT-LABEL": "出力の追加", - "BUTTON-ADD-RULE-LABEL": "ルールの追加", - "BUTTON-MOVE-RULE-UPWARDS-LABEL": "上へ移動", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL": "下へ移動", - "BUTTON-REMOVE-RULE-LABEL": "ルールの削除", - "ALERT": { - "EXPRESSION-VARIABLE-REQUIRED-ERROR": "入力式と出力式はフォームフィールドか変数を参照する必要があります。", - "SAVE-CONFIRM": "デシジョンテーブル“{{name}}”を保存" - } - }, - "TOUR": { - "WELCOME-TITLE": "ようこそ、{{userName}} さん", - "WELCOME-CONTENT": "これはFlowableエディターのショートツアーです。次のステップは別のセクションで説明されます。ESCキーによっていつでも中断できます。", - "PALETTE-TITLE": "パレット", - "PALETTE-CONTENT": "ビジネスプロセスを作成するためのすべての構築物をここで見つけることができます。論理的なグループに整理されています。グループはクリックで開きます:", - "CANVAS-TITLE": "キャンバス", - "CANVAS-CONTENT": "ビジネスプロセスを作成するための作業場所です。パレットから要素をドラッグしキャンバスの上にドロップし、モデリングを開始してください。", - "DRAGDROP-TITLE": "ドラッグ&ドロップ例", - "DRAGDROP-CONTENT": "どのようにモデリングをするのかの例が用意されています:", - "PROPERTIES-TITLE": "属性", - "PROPERTIES-CONTENT": "ビジネスプロセスの部品の属性を設定できます。キャンバス上のアイテムを選択すると属性が表示されます。編集したい属性をクリックしてください。", - "TOOLBAR-TITLE": "ツールバー", - "TOOLBAR-CONTENT": "アクションはすべてここにあります: モデルの保存、検証、プロセス部品のコピー\r&ペースなどボタンの上にマウスカーソルを重ねるとアクションの説明が表示されます。", - "END-TITLE": "終わり", - "END-CONTENT": "以上です。プロセスのモデリングを始めることができます。質問があればFlowable Forumに投稿してください。" - }, - "FEATURE-TOUR": { - "BENDPOINT": { - "TITLE": "屈折点のチュートリアル", - "DESCRIPTION": "プロセスのステップをシークエンスフロー(ステップ間の矢印)で繋げる時、シークエンスフロー同士を交差させたり違う形で揃えたりしたくなるかもしれません。その様な場合、シークエンスフローに屈折点を追加したり、逆に削除したりすることができます。シーケンスフローに屈折点を追加したり、逆に削除することで経路を変えることができます。

下の図にあるように、屈折点の追加をクリックしてから対象となるシーケンスフローを選択します。屈折点が追加できるところは緑色で示されます。

削除の仕方も同様です。“屈折点の削除”をクリックし、それから対象の屈折点を選択します。" - } - }, - "ACTION.OK": "OK", - "ACTION.SAVE": "保存", - "ACTION.SAVE-AND-CLOSE": "保存してエディターを閉じる", - "ACTION.SEND": "送信", - "ACTION.CANCEL": "キャンセル", - "ACTION.SELECT": "選択", - "ACTION.ADD": "追加", - "ACTION.REMOVE": "削除", - "ACTION.MOVE.UP": "上へ移動", - "ACTION.MOVE.DOWN": "下へ移動", - "TOOLBAR.ACTION.CLOSE": "エディターを終了し概要ページに戻る", - "TOOLBAR.ACTION.SAVE": "モデルの保存", - "TOOLBAR.ACTION.VALIDATE": "モデルの検証", - "TOOLBAR.ACTION.CUT": "カット(ビジネスプロセス内の一つ以上の要素を選択)", - "TOOLBAR.ACTION.COPY": "コピー(ビジネスプロセス内の一つ以上の要素を選択)", - "TOOLBAR.ACTION.PASTE": "貼り付け", - "TOOLBAR.ACTION.DELETE": "選択した要素を削除", - "TOOLBAR.ACTION.UNDO": "元に戻す", - "TOOLBAR.ACTION.REDO": "やり直す", - "TOOLBAR.ACTION.ZOOMIN": "ズームイン", - "TOOLBAR.ACTION.ZOOMOUT": "ズームアウト", - "TOOLBAR.ACTION.ZOOMACTUAL": "元のサイズ", - "TOOLBAR.ACTION.ZOOMFIT": "ウィンドウに合わせる", - "TOOLBAR.ACTION.BENDPOINT.ADD": "選択したシークエンスフローに屈折点を追加", - "TOOLBAR.ACTION.BENDPOINT.REMOVE": "選択したシークエンスフローから屈折点を削除", - "TOOLBAR.ACTION.ALIGNHORIZONTAL": "モデルの整列 水平", - "TOOLBAR.ACTION.ALIGNVERTICAL": "モデルの整列 垂直", - "TOOLBAR.ACTION.SAMESIZE": "同じサイズ", - "TOOLBAR.ACTION.HELP": "ガイドツアーの開始", - "TOOLBAR.ACTION.FEEDBACK": "フィードバックを提供", - "FORM_TOOLBAR.ACTION.SAVE": "モデルの保存", - "APP_DEFINITION_TOOLBAR.ACTION.SAVE": "アプリ定義の保存", - "BUTTON.ACTION.DELETE.TOOLTIP": "モデルから要素を削除", - "BUTTON.ACTION.MORPH.TOOLTIP": "要素タイプの変更", - "ELEMENT.AUTHOR": "作成者", - "ELEMENT.DATE_CREATED": "作成日", - "PROPERTY.REMOVED": "削除済", - "PROPERTY.EMPTY": "値なし", - "PROPERTY.PROPERTY.EDIT.TITLE": "値を変更", - "PROPERTY.FEEDBACK.TITLE": "フィードバックをご記入ください", - "PROPERTY.ASSIGNMENT.TITLE": "割当", - "PROPERTY.ASSIGNMENT.TYPE": "タイプ", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE": "IDストア", - "PROPERTY.ASSIGNMENT.TYPE.STATIC": "固定値", - "PROPERTY.ASSIGNMENT.ASSIGNEE": "担当者", - "PROPERTY.ASSIGNMENT.MATCHING": "↑と↓で選択し、エンターで確認 あるいはマウスを使用", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER": "担当者を入力", - "PROPERTY.ASSIGNMENT.EMPTY": "担当者が選択されていません。", - "PROPERTY.ASSIGNMENT.NONE": "該当なし...", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "ユーザーを検索", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "グループの検索", - "PROPERTY.ASSIGNMENT.SEARCH": "検索:", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY": "担当者 {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY": "{{length}}人の候補ユーザー", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS": "候補ユーザー", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY": "{{length}}個の候補グループ", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS": "候補グループ", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY": "ユーザー {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY": "ユーザー {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY": "フィールド {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY": "プロセス開始者", - "PROPERTY.ASSIGNMENT.IDM.TYPE": "割当", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS": "候補ユーザーが選択されていません...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS": "候補グループが選択されていません...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR": "プロセス開始者の割当", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER": "単一のユーザーに割当", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS": "候補ユーザー", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS": "候補グループ", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE": "プロセス開始者にタスクの完了を許可", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY": "{{length}}個の実行リスナー", - "PROPERTY.EXECUTIONLISTENERS.EMPTY": "実行リスナーが設定されていません。", - "PROPERTY.EXECUTIONLISTENERS.EVENT": "イベント", - "PROPERTY.EXECUTIONLISTENERS.CLASS": "クラス", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER": "クラス名を入力", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION": "式", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION": "委譲式", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER": "委譲式を入力", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED": "実行リスナーが選択されていません", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME": "名前", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION": "式", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE": "文字列値", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER": "文字列値を入力", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING": "文字列", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER": "文字列を入力", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION": "実装", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY": "フィールドが選択されていません。", - "PROPERTY.FIELDS": "{{length}}個のフィールド", - "PROPERTY.FIELDS.EMPTY": "フィールドが選択されていません。", - "PROPERTY.FIELDS.NAME": "名前", - "PROPERTY.FIELDS.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.FIELDS.EXPRESSION": "式", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.FIELDS.STRINGVALUE": "文字列値", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER": "文字列値を入力", - "PROPERTY.FIELDS.STRING": "文字列", - "PROPERTY.FIELDS.STRING.PLACEHOLDER": "文字列を入力", - "PROPERTY.FIELDS.IMPLEMENTATION": "実装", - "PROPERTY.EXCEPTIONS": "{{length}}個の例外", - "PROPERTY.EXCEPTIONS.EMPTY": "例外は選択されていません", - "PROPERTY.EXCEPTIONS.CODE": "コード", - "PROPERTY.EXCEPTIONS.CODE.PLACEHOLDER": "コードを入力", - "PROPERTY.EXCEPTIONS.CLASS": "クラス", - "PROPERTY.EXCEPTIONS.CLASS.PLACEHOLDER": "クラスを入力", - "PROPERTY.EXCEPTIONS.CHILDREN": "子例外を含む", - "PROPERTY.DATAPROPERTIES.VALUES": "{{length}}個のデータオブジェクト", - "PROPERTY.DATAPROPERTIES.EMPTY": "データオブジェクトは設定されていません", - "PROPERTY.DATAPROPERTIES.ID": "ID", - "PROPERTY.DATAPROPERTIES.ID.PLACEHOLDER": "IDを入力", - "PROPERTY.DATAPROPERTIES.NAME": "名前", - "PROPERTY.DATAPROPERTIES.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.DATAPROPERTIES.TYPE": "タイプ", - "PROPERTY.DATAPROPERTIES.VALUE.PLACEHOLDER": "値の入力(任意)", - "PROPERTY.DATAPROPERTIES.VALUE": "デフォルト値", - "PROPERTY.FORMPROPERTIES.VALUE": "{{length}}個のフォーム属性", - "PROPERTY.FORMPROPERTIES.EMPTY": "フォーム属性が選択されていません。", - "PROPERTY.FORMPROPERTIES.ID": "ID", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER": "IDを入力", - "PROPERTY.FORMPROPERTIES.NAME": "名前", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.FORMPROPERTIES.TYPE": "タイプ", - "PROPERTY.FORMPROPERTIES.DATEPATTERN": "日付パターン", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER": "日付パターンを入力", - "PROPERTY.FORMPROPERTIES.VALUES": "値", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY": "Enum値が選択されていません。", - "PROPERTY.FORMPROPERTIES.VALUES.ID": "ID", - "PROPERTY.FORMPROPERTIES.VALUES.NAME": "名前", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER": "値のIDを入力", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER": "値の名前を入力", - "PROPERTY.FORMPROPERTIES.EXPRESSION": "式", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.FORMPROPERTIES.VARIABLE": "変数", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER": "変数を入力", - "PROPERTY.FORMPROPERTIES.DEFAULT": "既定", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER": "規定値を入力", - "PROPERTY.FORMPROPERTIES.REQUIRED": "必須", - "PROPERTY.FORMPROPERTIES.READABLE": "読み取り可", - "PROPERTY.FORMPROPERTIES.WRITABLE": "書き込み可", - "PROPERTY.INPARAMETERS.VALUE": "{{length}}のinパラメーター", - "PROPERTY.INPARAMETERS.EMPTY": "In-パラメーターは設定されていません", - "PROPERTY.OUTPARAMETERS.VALUE": "{{length}}のoutパラメーター", - "PROPERTY.OUTPARAMETERS.EMPTY": "Out-パラメーターは設定されていません", - "PROPERTY.PARAMETER.SOURCE": "参照元", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER": "参照元を入力", - "PROPERTY.PARAMETER.SOURCEEXPRESSION": "参照元式", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER": "参照元式を入力", - "PROPERTY.PARAMETER.TARGET": "参照先", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER": "参照先を入力", - "PROPERTY.PARAMETER.TARGETEXPRESSION": "参照先式", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER": "参照先式を入力", - "PROPERTY.PARAMETER.EMPTY": "パラメータが選択されていません。", - "PROPERTY.PROCESSREFERENCE.EMPTY": "参照が選択されていません", - "PROPERTY.PROCESSREFERENCE.TITLE": "プロセス参照", - "PROPERTY.PROCESSREFERENCE.ERROR.PROCESS": "プロセスのロード中にエラーがありました。しばらくしてから再度試してください", - "PROPERTY.PROCESSREFERENCE.PROCESS.LOADING": "プロセスをロード中...", - "PROPERTY.PROCESSREFERENCE.PROCESS.EMPTY": "このフォルダにはプロセスが含まれていません。", - "PROPERTY.FORMREFERENCE.EMPTY": "参照が選択されていません", - "PROPERTY.FORMREFERENCE.TITLE": "フォーム参照", - "PROPERTY.FORMREFERENCE.DESCRIPTION": "フォームへの参照", - "PROPERTY.FORMREFERENCE.ERROR.FORM": "フォームのロード中にエラーがありました。しばらくしてから再度試してください", - "PROPERTY.FORMREFERENCE.FORM.LOADING": "フォームをロード中...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY": "このフォルダにはフォームが含まれていません", - "PROPERTY.TASKLISTENERS.VALUE": "{{length}}個のタスクリスナー", - "PROPERTY.TASKLISTENERS.EMPTY": "タスクリスナーは設定されていません", - "PROPERTY.TASKLISTENERS.EVENT": "イベント", - "PROPERTY.TASKLISTENERS.CLASS": "クラス", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER": "クラス名を入力", - "PROPERTY.TASKLISTENERS.EXPRESSION": "式", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION": "委譲式", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER": "委譲式を入力", - "PROPERTY.TASKLISTENERS.UNSELECTED": "タスクリスナーが選択されていません", - "PROPERTY.TASKLISTENERS.FIELDS.NAME": "名前", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION": "式", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE": "文字列値", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER": "文字列値を入力", - "PROPERTY.TASKLISTENERS.FIELDS.STRING": "文字列", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER": "文字列を入力", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION": "実装", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY": "フィールドが選択されていません。", - "PROPERTY.EVENTLISTENERS.DISPLAY": "{{length}}個のイベントリスナー", - "PROPERTY.EVENTLISTENERS.EMPTY": "イベントリスナーは設定されていません", - "PROPERTY.EVENTLISTENERS.EVENTS": "イベント", - "PROPERTY.EVENTLISTENERS.RETHROW": "イベントを再発火させますか?", - "PROPERTY.EVENTLISTENERS.CLASS": "クラス", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER": "クラス名を入力", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION": "委譲式", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER": "委譲式を入力", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE": "エンティティタイプ", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER": "エンティティタイプを入力", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE": "イベントタイプの再発火", - "PROPERTY.EVENTLISTENERS.ERRORCODE": "エラーコード", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER": "エラーコードを入力", - "PROPERTY.EVENTLISTENERS.MESSAGENAME": "メッセージ名", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER": "メッセージ名を入力", - "PROPERTY.EVENTLISTENERS.SIGNALNAME": "信号名", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER": "信号名を入力", - "PROPERTY.EVENTLISTENERS.UNSELECTED": "イベントリスナーが選択されていません。", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE": "{{length}}個のライフサイクルリスナー", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY": "ライフサイクルリスナーは設定されていません", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT": "イベント", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE": "ソース状態", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE": "ターゲット状態", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS": "クラス", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER": "クラス名を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION": "式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION": "委譲式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER": "委譲式を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED": "タスクリスナーが選択されていません", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME": "名前", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION": "式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER": "式を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE": "文字列値", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER": "文字列値を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING": "文字列", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER": "文字列を入力", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION": "実装", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY": "フィールドが選択されていません。", - "PROPERTY.SIGNALDEFINITIONS.DISPLAY": "{{length}}個の信号定義", - "PROPERTY.SIGNALDEFINITIONS.EMPTY": "信号定義は設定されていません", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL": "グローバル", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE": "プロセスインスタンス", - "PROPERTY.SIGNALDEFINITIONS.ID": "ID", - "PROPERTY.SIGNALDEFINITIONS.NAME": "名前", - "PROPERTY.SIGNALDEFINITIONS.SCOPE": "スコープ", - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY": "{{length}}個のメッセージ定義", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY": "メッセージ定義は設定されていません", - "PROPERTY.MESSAGEDEFINITIONS.ID": "ID", - "PROPERTY.MESSAGEDEFINITIONS.NAME": "名前", - "PROPERTY.ESCALATIONDEFINITIONS.DISPLAY": "{{length}}個のエスカレーション定義", - "PROPERTY.ESCALATIONDEFINITIONS.EMPTY": "エスカレーション定義は設定されていません", - "PROPERTY.ESCALATIONDEFINITIONS.ID": "ID", - "PROPERTY.ESCALATIONDEFINITIONS.NAME": "名前", - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY": "シークエンスフローの順序が決定されていません", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY": "シークエンスフローに順序が設定されています", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND": "外向きシークエンスフローはありません", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION": "評価されるシークエンスフローの順番を設定:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE": "{{targetType}} {{targetTitle}} へのシークエンスフロー", - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE": "シークエンスフロー条件", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC": "条件式", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY": "条件は設定されていません", - "PROPERTY.DUEDATE.EMPTY": "期日はありません", - "PROPERTY.DUEDATE.DEFINED": "定義された期日", - "PROPERTY.DUEDATE.TITLE": "期日", - "PROPERTY.DUEDATE.EXPRESSION-LABEL": "期日式", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE": "期日はありません", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION": "式定義", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC": "タスク作成後の固定期日", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD": "フィールドに依存", - "PROPERTY.EVENTINPARAMETERS.VALUE": "{{length}}個のイベントinパラメーターアイテム", - "PROPERTY.EVENTINPARAMETERS.EMPTY": "パラメーターアイテムは設定されていません", - "PROPERTY.EVENTINPARAMETERS.EVENTNAME": "イベント属性名", - "PROPERTY.EVENTINPARAMETERS.EVENTNAME.PLACEHOLDER": "イベント属性名を入力", - "PROPERTY.EVENTINPARAMETERS.EVENTTYPE": "タイプ", - "PROPERTY.EVENTINPARAMETERS.VARIABLENAME": "変数名", - "PROPERTY.EVENTINPARAMETERS.VARIABLENAME.PLACEHOLDER": "変数名を入力", - "PROPERTY.EVENTINPARAMETERS.NOSELECTION": "パラメータが選択されていません。", - "PROPERTY.EVENTOUTPARAMETERS.VALUE": "{{length}}個のイベントoutパラメーターアイテム", - "PROPERTY.EVENTOUTPARAMETERS.EMPTY": "パラメーターアイテムは設定されていません", - "PROPERTY.EVENTOUTPARAMETERS.EVENTNAME": "イベント属性名", - "PROPERTY.EVENTOUTPARAMETERS.EVENTNAME.PLACEHOLDER": "イベント属性名を入力", - "PROPERTY.EVENTOUTPARAMETERS.EVENTTYPE": "タイプ", - "PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME": "変数名", - "PROPERTY.EVENTOUTPARAMETERS.VARIABLENAME.PLACEHOLDER": "変数名を入力", - "PROPERTY.EVENTOUTPARAMETERS.NOSELECTION": "パラメータが選択されていません。", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUE": "{{length}}個の相関パラメーター", - "PROPERTY.EVENTCORRELATIONPARAMETERS.EMPTY": "相関パラメーターは設定されていません", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NAME": "名前", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NAME.PLACEHOLDER": "名前を入力", - "PROPERTY.EVENTCORRELATIONPARAMETERS.TYPE": "タイプ", - "PROPERTY.EVENTCORRELATIONPARAMETERS.NOSELECTION": "パラメータが選択されていません。", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUEPROP": "値", - "PROPERTY.EVENTCORRELATIONPARAMETERS.VALUEPROP.PLACEHOLDER": "値/式を入力", - "MODEL.SAVE.TITLE": "モデルの保存", - "MODEL.VALIDATE.TITLE": "検証結果", - "MODEL.NAME": "名前", - "MODEL.KEY": "キー", - "MODEL.DESCRIPTION": "説明", - "MODEL.SAVE.NEWVERSION": "新しいバージョンとして保存しますか?いつでも以前のバージョンに戻ることができるようになります", - "MODEL.SAVE.COMMENT": "コメント", - "MODEL.SAVE.SAVING": "モデルの保存中", - "MODEL.LASTMODIFIEDDATE": "最終更新", - "MODEL.SAVE.ERROR": "予期せぬエラー: モデルが保存できません", - "MODEL.VALIDATIONERRORS": "モデル内に検証エラーがあります。この状態ではFlowableエンジンにモデルをデプロイできません。", - "MODEL.CONFLICT.WRITE": "モデルを保存できません: {{userFullName}} によってこのモデルは変更されています", - "MODEL.CONFLICT.WRITE.OPTIONS": "このコンフリクトを解消する方法を選択してください:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE": "他のモデルを上書き", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES": "変更を破棄", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS": "新しいモデルとして保存", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION": "新しいバージョンの作成", - "MODEL.CONFLICT.SAVEAS": "別名で保存:", - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP": "アクティビティが他のアクティビティの代替として実行されようとしています。イベントは補償となるアクティビティを指定しています。", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP": "アクティビティの実行が完了しました", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP": "アクティビティがエラーイベントを受け取った時。実際にエラーを受け取る前に発行されます。", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP": "新しいメンバーシップが作成されました", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP": "メンバーシップが削除されました", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP": "グループに関連するメンバーシップをすべて削除しました。パフォーマンス負荷を回避するため個別のイベントは発行されません。", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP": "タスクが割当られました。ENTITY_UPDATEDイベントが発行されました。", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP": "タスクが完了した時。タスクエンティティの削除前に発行されます。", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP": "BPMNエラーが発行されプロセス内では補足されなかった時", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP": "変数が作成された時", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP": "既存の変数が削除された時。", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP": "変数が更新されました", - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY": "参照が選択されていません", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE": "デシジョンテーブル参照", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM": "デシジョンテーブルのロード中にエラーがありました。しばらくしてから再度試してください", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING": "デシジョンテーブルをロード中...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY": "このフォルダーにはデシジョンテーブルがありません", - "PROPERTY.DECISIONSERVICEREFERENCE.EMPTY": "参照が選択されていません", - "PROPERTY.DECISIONSERVICEREFERENCE.TITLE": "デシジョンサービス参照", - "PROPERTY.DECISIONSERVICEREFERENCE.ERROR.FORM": "デシジョンサービスのロード中にエラーがありました。しばらくしてから再度試してください", - "PROPERTY.DECISIONSERVICEREFERENCE.DECISIONSERVICE.LOADING": "デシジョンサービスをロード中...", - "PROPERTY.DECISIONSERVICEREFERENCE.DECISIONSERVICE.EMPTY": "このフォルダーにはデシジョンサービスがありません", - "PROPERTY.CASEREFERENCE.EMPTY": "参照が選択されていません", - "PROPERTY.CASEREFERENCE.TITLE": "ケースモデル参照", - "PROPERTY.CASEREFERENCE.ERROR.FORM": "ケースモデルのロード中にエラーがありました。しばらくしてから再度試してください", - "PROPERTY.CASEREFERENCE.CASE.LOADING": "ケースモデルをロード中...", - "PROPERTY.CASEREFERENCE.CASE.EMPTY": "このフォルダーにはケースモデルがありません" -} \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/pt-BR.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/pt-BR.json deleted file mode 100644 index 5760ae1a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/pt-BR.json +++ /dev/null @@ -1,819 +0,0 @@ -{ - "GENERAL":{ - "MAIN-TITLE":"Editor Flowable", - "NAVIGATION":{ - "PROCESSES":"Processos", - "FORMS":"Formulários", - "DECISION-TABLES":"Tabelas de Decisão", - "APPS":"Aplicativos" - }, - "TITLE":{ - "SELECT-GROUP":"Selecionar grupo", - "MATCHING-GROUPS":"Grupos correspondentes", - "FILTER":"Filtro", - "HISTORY":"Histórico" - }, - "ACTION":{ - "LOGOUT":"Sair", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST":"Mostrar todas as definições", - "CANCEL":"Cancelar", - "CLOSE":"Fechar", - "EDIT":"Editar", - "SAVE":"Salvar", - "OPEN":"Abrir", - "OK":"Ok", - "CONFIRM":"Confirmar", - "CONFIRM-AND-CLOSE":"Confirmar e fechar", - "NEW-FORM":"Novo formulário", - "CREATE-FORM":"Criar formulário", - "NEW-DECISION-TABLE":"Nova tabela de decisão", - "CREATE-DECISION-TABLE":"Criar tabela de decisão" - }, - "MESSAGE":{ - "SELECT-GROUP-HELP":"Use ↑ e ↓ para selecionar e pressione Enter para confirmar", - "PEOPLE-NO-MATCHING-RESULTS":"Nenhum usuário correspondente foi encontrado", - "GROUP-NO-MATCHING-RESULTS":"Nenhum grupo correspondente foi encontrado", - "GROUP-SOURCE-TYPE":"Grupo de origem", - "GROUP-SOURCE-SEARCH-OPTION":"Pesquisa por grupo", - "GROUP-SOURCE-FIELD-OPTION":"Campo de formulário" - } - }, - "EDITOR":{ - "POPUP":{ - "UNSAVED-CHANGES":{ - "TITLE":"Você tem alterações não salvas", - "DESCRIPTION":"O que deseja fazer com as suas alterações não salvas?", - "ACTION":{ - "SAVE":"Salvar as alterações", - "DISCARD":"Descartar as alterações", - "CONTINUE":"Continuar editando" - } - } - } - }, - "PROCESS-LIST":{ - "TITLE":"Modelo de processo de negócios", - "SEARCH-PLACEHOLDER":"Pesquisar", - "ACTION":{ - "CREATE":"Criar processo", - "IMPORT":"Importar processo" - }, - "FILTER":{ - "PROCESSES":"Modelos de processo", - "PROCESSES-COUNT":"Existem {{total}} modelos de processos", - "PROCESSES-ONE":"Há um modelo de processo", - "PROCESSES-EMPTY":"Não há modelo de processo criado ainda. Você pode projetar modelos de processos, formulários de usuário e então empacotá-los em um aplicativo de processo. O primeiro passo é criar um modelo de processo:", - "PROCESSES-BPMN-HINT":"Crie um modelo BPMN usando o Editor Visual de BPMN.", - "PROCESSES-BPMN-IMPORT-HINT":"Você também pode importar modelos BPMN existentes.", - "FILTER-TEXT":", correspondente a \"{{filterText}}\"", - "FILTER-TEXT-EMPTY":"Não há modelo de processo correspondente a \"{{filterText}}\"", - "RECENT":"Recente", - "RECENT-COUNT":"{{total}} modelos usados recentemente", - "RECENT-ONE":"Um modelo usado recentemente", - "RECENT-EMPTY":"Nenhum modelo usado recentemente" - }, - "SORT":{ - "MODIFIED-ASC":"Mais antigo", - "MODIFIED-DESC":"Modificado por último", - "NAME-ASC":"Nome, A-Z", - "NAME-DESC":"Nome, Z-A" - } - }, - "FORMS-LIST":{ - "TITLE":"Formulários", - "SEARCH-PLACEHOLDER":"Pesquisar", - "ACTION":{ - "CREATE":"Criar formulário", - "CREATE-INLINE":"Crie um novo formulário agora!", - "SHOW-MORE":"Mostrar mais..." - }, - "FILTER":{ - "FORMS":"Formulários", - "FORMS-COUNT":"Existem {{total}} formulários", - "FORMS-ONE":"Existe um formulário", - "FORMS-EMPTY":"Não existem formulários. Para adicionar um, clique em criar formulário.", - "FILTER-TEXT":", correspondente a \"{{filterText}}\"", - "FILTER-TEXT-EMPTY":"Não há formulário correspondente a \"{{filterText}}\"" - }, - "SORT":{ - "MODIFIED-ASC":"Mais antigo", - "MODIFIED-DESC":"Último Modificado", - "NAME-ASC":"Nome, A-Z", - "NAME-DESC":"Nome, Z-A" - } - }, - "DECISIONS-LIST":{ - "TITLE":"Tabelas de Decisão", - "SEARCH-PLACEHOLDER":"Busca", - "ACTION":{ - "CREATE":"Criar Tabela de Decisão", - "IMPORT":"Importar tabela de decisão", - "CREATE-INLINE":"Criar uma nova tabela de decisão agora!", - "SHOW-MORE":"Mostrar mais..." - }, - "FILTER":{ - "DECISION-TABLES":"Tabelas de decisão", - "DECISION-TABLES-COUNT":"Existem {{total}} tabelas de decisão", - "DECISION-TABLES-ONE":"Há uma tabela de decisão", - "DECISION-TABLES-EMPTY":"Não há tabela de decisão. Para adicionar uma, clique em criar tabela de decisão.", - "FILTER-TEXT":", correspondente a \"{{filterText}}\"", - "FILTER-TEXT-EMPTY":"Não há tabela de decisão correspondente a \"{{filterText}}\"" - }, - "SORT":{ - "MODIFIED-ASC":"Mais antigo", - "MODIFIED-DESC":"Modificado por último", - "NAME-ASC":"Nome, A-Z", - "NAME-DESC":"Nome, Z-A" - } - }, - "APPS-LIST":{ - "TITLE":"Definições de Aplicativo", - "SEARCH-PLACEHOLDER":"Pesquisar", - "ACTION":{ - "CREATE":"Criar Aplicativo", - "IMPORT":"Importar aplicativo", - "SHOW-MORE":"Mostrar mais..." - }, - "FILTER":{ - "APPS":"Definições de Aplicativo", - "APPS-COUNT":"Existem {{total}} definições de aplicativos", - "APPS-ONE":"Há uma definição de aplicativo", - "APPS-EMPTY":"Não há definições de aplicativo. Para adicionar uma, clique em criar definição de Aplicativo.", - "FILTER-TEXT":", correspondente a \"{{filterText}}\"", - "FILTER-TEXT-EMPTY":"Não há definições de aplicativo correspondentes a \"{{filterText}}\"", - "NO-APPS":"Você pode criar uma definição de Aplicativo, através da publicação de um pacote de modelos de processo.", - "NO-APPS-CALL-TO-ACTION":"Você pode criar uma definição de Aplicativo agora.", - "NO-APPS-NOTE":"Lembre-se de publicá-lo quando você estiver pronto para usá-lo." - }, - "SORT":{ - "MODIFIED-ASC":"Mais antigo", - "MODIFIED-DESC":"Modificado por último", - "NAME-ASC":"Nome, A-Z", - "NAME-DESC":"Nome, Z-A" - } - }, - "PROCESS":{ - "NAME":"Nome do modelo", - "KEY":"Chave do modelo", - "DESCRIPTION":"Descrição", - "VERSION-COMMENT":"Comentários da versão", - "ACTION":{ - "DETAILS":"Mostrar detalhes", - "EDIT":"Modificar propriedades do modelo", - "DUPLICATE":"Duplicar este modelo", - "EXPORT_BPMN20":"Exportar para BPMN 2.0", - "DELETE":"Excluir este modelo", - "CREATE-CONFIRM":"Criar novo modelo", - "DUPLICATE-CONFIRM":"Duplique o modelo", - "OPEN-IN-EDITOR":"Editor Visual", - "EDIT-CONFIRM":"Salvar", - "DELETE-CONFIRM":"Excluir o modelo de processo", - "USE-AS-NEW-VERSION":"Usar como uma nova versão", - "FAVORITE":"Adicionar este modelo aos favoritos" - }, - "DETAILS":{ - "HISTORY-TITLE":"Histórico", - "LAST-UPDATED-BY":"Última atualização feita por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY":"Criado por {{createdBy}}", - "NO-DESCRIPTION":"Este modelo não tem descrição. Modifique as propriedades do modelo para adicionar uma" - }, - "POPUP":{ - "CREATE-TITLE":"Criar um novo modelo de processo de negócio", - "DUPLICATE-TITLE":"Duplicar o modelo de processo de negócio", - "CREATE-DESCRIPTION":"Você precisa dar um nome para o novo modelo e você pode querer também adicionar uma descrição ao mesmo tempo.", - "DUPLICATE-DESCRIPTION":"Você pode alterar o nome para o novo modelo e você pode querer alterar a descrição ao mesmo tempo.", - "EDIT-DESCRIPTION":"Altere qualquer uma das propriedades modelo abaixo e em seguida pressione Salvar para atualizar o modelo.", - "DELETE-DESCRIPTION":"Tem certeza que deseja excluir o modelo de processo \"{{name}}\"?", - "EDIT-TITLE":"Editar detalhes do modelo", - "DELETE-TITLE":"Excluir o modelo", - "DELETE-LOADING-RELATIONS":"Verificar o uso de modelo...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE":"Este modelo não pode ser excluído, porque o outro modelo está a usá-lo:", - "DELETE-RELATIONS-DESCRIPTION":"Este modelo não pode ser excluído, porque ele é usado por outros modelos:", - "DELETE-PROCESS-RELATION":"Modelos de processo", - "DELETE-FORM-RELATION":"Modelo de formulário", - "DELETE-APP-RELATION":"Modelo de aplicativo", - "IMPORT-DESCRIPTION":"Por favor, procure ou arraste e solte uma definição de BPMN XML com um arquivo .bpmn ou .bpmn20.xml", - "IMPORT-TITLE":"Importar um modelo de processo", - "USE-AS-NEW-TITLE":"Use como nova versão", - "USE-AS-NEW-DESCRIPTION":"Tem certeza que quer usar a versão {{version}} para criar uma nova versão de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR":"Não foi possível restaurar completamente o modelo de aplicativo para a versão escolhida: alguns modelos referenciados estão ausentes poque foram excluído no passado. Por favor, atualize o modelo de aplicativo em conformidade. Modelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL":"Modelo '{{name}}' com id interno {{id}}, criado por {{createdBy}}", - "SHARED-WITH":"Compartilhado com", - "PERMISSION":"Permissão", - "ACTIONS":"Ações", - "IMPORT":{ - "DROPZONE":"Arraste e solte um arquivo .bpmn ou bpmn20.xml", - "CANCEL-UPLOAD":"Cancelar o upload", - "ERROR":"Erro ao processar o arquivo XML BPMN", - "NO-DROP":"Arrastar e soltar não suportado" - } - }, - "ALERT":{ - "EDIT-CONFIRM":"Modelo atualizado" - }, - "ERROR":{ - "NOT-FOUND":"O modelo solicitado não existe" - } - }, - "SUBPROCESS":{ - "NAME":"Nome do subprocesso", - "DESCRIPTION":"Descrição", - "ACTION":{ - "CREATE-CONFIRM":"Criar novo subprocesso" - }, - "POPUP":{ - "CREATE-TITLE":"Criar um novo subprocesso", - "CREATE-DESCRIPTION":"Você precisa dar um nome para o novo subprocesso e você pode querer adicionar uma descrição ao mesmo tempo." - } - }, - "FORM":{ - "NAME":"Nome do formulário", - "KEY":"Chave do formulário", - "DESCRIPTION":"Descrição", - "ACTION":{ - "DETAILS":"Mostrar detalhes", - "EDIT":"Modificar propriedades do modelo", - "DELETE":"Excluir este formulário", - "CREATE-CONFIRM":"Criar novo formulário", - "DUPLICATE-CONFIRM":"Duplicar o formulário", - "OPEN-IN-EDITOR":"Editor de formulário", - "EDIT-CONFIRM":"Salvar", - "DELETE-CONFIRM":"Excluir Formulário", - "USE-AS-NEW-VERSION":"Usar como uma nova versão" - }, - "DETAILS":{ - "HISTORY-TITLE":"Histórico", - "LAST-UPDATED-BY":"Última atualização feita por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY":"Criado por {{createdBy}}" - }, - "POPUP":{ - "CREATE-TITLE":"Criar novo formulário", - "DUPLICATE-TITLE":"Duplicar o formulário", - "CREATE-DESCRIPTION":"Você precisa dar um nome para o novo formulário e você pode querer adicionar uma descrição ao mesmo tempo.", - "DUPLICATE-DESCRIPTION":"Você precisa dar um nome para o novo formulário e você pode querer adicionar uma descrição ao mesmo tempo.", - "SAVE-FORM-TITLE":"Salvar formulário", - "EDIT-DESCRIPTION":"Altere qualquer uma das propriedades do formulário abaixo e em seguida pressione Salvar para atualizar o formulário.", - "DELETE-DESCRIPTION":"Tem certeza que deseja excluir o formulário \"{{name}}\"?", - "EDIT-TITLE":"Editar detalhes do formulário", - "DELETE-TITLE":"Excluir Formulário", - "USE-AS-NEW-TITLE":"Usar como uma nova versão", - "USE-AS-NEW-VERSION":"Usar como uma nova versão", - "USE-AS-NEW-DESCRIPTION":"Tem certeza que quer usar a versão {{version}} para criar uma nova versão de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR":"Não foi possível restaurar completamente o modelo de aplicativo para a versão escolhida: alguns modelos referenciados estão ausentes poque foram excluído no passado. Por favor, atualize o modelo de aplicativo em conformidade. Modelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL":"Modelo '{{name}}' com id interno {{id}}, criado por {{createdBy}}" - } - }, - "DECISION-TABLE":{ - "NAME":"Nome da tabela de decisão", - "KEY":"Chave de tabela de decisão", - "DESCRIPTION":"Descrição", - "VERSION-COMMENT":"Comentários da versão", - "HIT-POLICY":"Acertar política:", - "ACTION":{ - "DETAILS":"Mostrar detalhes", - "EDIT":"Modificar propriedades do modelo", - "SHARE":"Compartilhar esta tabela de decisão", - "DELETE":"Excluir esta tabela de decisão", - "ADD-COMMENT":"+ Adicionar comentário", - "CREATE-CONFIRM":"Criar nova tabela de decisão", - "OPEN-IN-EDITOR":"Editor de tabela de decisão", - "EXPORT":"Exportar tabela de decisão", - "DELETE-CONFIRM":"Excluir a tabela de decisão", - "USE-AS-NEW-VERSION":"Usar como uma nova versão", - "FAVORITE":"Adicionar esta tabela de decisão aos favoritos", - "DUPLICATE":"Duplicar esta tabela de decisão" - }, - "DETAILS":{ - "HISTORY-TITLE":"Histórico", - "COMMENTS-TITLE":"Comentários", - "LAST-UPDATED-BY":"Última atualização feita por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY":"Criado por {{createdBy}}" - }, - "HIT-POLICIES":{ - "FIRST":"Primeiro (passagem única)", - "ANY":"Qualquer (passagem única)" - }, - "POPUP":{ - "CREATE-TITLE":"Criar uma nova tabela de decisão", - "CREATE-DESCRIPTION":"Você precisa dar um nome para a nova tabela de decisão, e você pode querer adicionar uma descrição ao mesmo tempo.", - "SAVE-DESCRIPTION":"Você precisa dar um nome e uma chave exclusiva para a nova tabela de decisão, e você pode querer adicionar uma descrição ao mesmo tempo.", - "DUPLICATE-TITLE":"Duplicar uma tabela de decisão", - "DUPLICATE-DESCRIPTION":"Você pode dar um nome para a tabela de decisão, e pode querer alterar a descrição ao mesmo tempo.", - "DELETE-TITLE":"Excluir a tabela de decisão", - "DELETE-DESCRIPTION":"Tem certeza que deseja excluir a tabela de decisão \"{{name}}\"?", - "SAVE-DECISION-TABLE-TITLE":"Salvar a tabela de decisão", - "IMPORT-DESCRIPTION":"Por favor, procure ou arraste e solte uma definição de DMN XML com uma extensão .dmn ou .dmn.xml", - "IMPORT-TITLE":"Importar um modelo DMN", - "IMPORT":{ - "DROPZONE":"Arraste e solte um arquivo DMN XML com extensão .dmn ou .dmn.xml", - "CANCEL-UPLOAD":"Cancelar o carregamento", - "ERROR":"Erro ao processar o arquivo XML DMN", - "NO-DROP":"Arrastar e soltar não suportado" - }, - "USE-AS-NEW-TITLE":"Usar como uma nova versão", - "USE-AS-NEW-VERSION":"Usar como uma nova versão", - "USE-AS-NEW-DESCRIPTION":"Tem certeza que quer usar a versão {{version}} para criar uma nova versão de \"{{name}}\"?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR":"Não foi possível restaurar completamente o modelo de aplicativo para a versão escolhida: alguns modelos referenciados estão ausentes poque foram excluído no passado. Por favor, atualize o modelo de aplicativo em conformidade. Modelos faltantes:", - "USE-AS-NEW-UNRESOLVED-MODEL":"Modelo '{{name}}' com id interno {{id}}, criado por {{createdBy}}" - }, - "ALERT":{ - "FAVORITE-CONFIRM":"Esta tabela de decisão agora está adicionada aos favoritos", - "UN-FAVORITE-CONFIRM":"Esta tabela de decisão já não está mais nos favoritos" - } - }, - "APP":{ - "NAME":"Nome de definição do Aplicativo", - "KEY":"Chave de definição do aplicativo", - "DESCRIPTION":"Descrição", - "ICON":"Ícone", - "THEME":"Tema", - "GROUPS-ACCESS":"Acesso de grupos, separado por vírgulas", - "USERS-ACCESS":"Acesso de usuários, separado por vírgulas", - "ACTION":{ - "DETAILS":"Mostrar detalhes", - "EDIT":"Modificar propriedades de definição do aplicativo", - "DUPLICATE":"Duplique esta aplicação", - "SHARE":"Compartilhar esta definição de aplicativo", - "DELETE":"Excluir esta definição de aplicativo", - "CREATE-CONFIRM":"Criar nova definição de aplicativo", - "DUPLICATE-CONFIRM":"Duplicar a definição de aplicativo", - "DELETE-CONFIRM":"Excluir a definição de aplicativo", - "USE-AS-NEW-VERSION":"Usar como uma nova versão", - "OPEN-IN-EDITOR":"Editor de Aplicativo", - "PUBLISH":"Publicar", - "PUBLISH-CONFIRM":"Publicar a definição de aplicativo", - "SELECT-ICON":"Mudar ícone...", - "SELECT-THEME":"Alterar tema...", - "EDIT-MODELS":"Editar modelos incluídos", - "EXPORT-ZIP":"Exportar definição de aplicativo como um arquivo zip", - "EXPORT-BAR":"Exportar definição de aplicativo como um arquivo de implantação bar" - }, - "DETAILS":{ - "TITLE":"Detalhes da definição do aplicativo: {{name}}", - "HISTORY-TITLE":"Histórico", - "MODELS-TITLE":"Modelos incluídos na definição do aplicativo", - "LAST-UPDATED-BY":"Última atualização feita por {{lastUpdatedBy}} - {{lastUpdated | dateformat}}", - "CREATED-BY":"Criado por {{createdBy}}", - "NO-DESCRIPTION":"Esta definição de aplicativo não tem descrição. Modifique as propriedades de definição do aplicativo para adicionar uma", - "NO-MODELS-SELECTED":"Não há modelos selecionados para este aplicativo" - }, - "TITLE":{ - "SELECT-ICON":"Selecione o ícone para o aplicativo", - "SELECT-THEME":"Selecione as cores para o aplicativo", - "PREVIEW":"Visualizar" - }, - "POPUP":{ - "CREATE-TITLE":"Criar uma nova definição de aplicativo", - "DUPLICATE-TITLE":"Duplicar uma definição de aplicativo", - "SAVE-APP-TITLE":"Salvar a definição de aplicativo", - "SAVE-APP-SAVE-SUCCESS":"Definição de aplicativo salva", - "CREATE-DESCRIPTION":"Você precisa dar um nome para a nova definição do aplicativo, e você pode querer também adicionar uma descrição ao mesmo tempo.", - "DUPLICATE-DESCRIPTION":"Você pode dar um nome para a nova definição de aplicativo, e pode querer alterar a descrição ao mesmo tempo.", - "PUBLISH-TITLE":"Publicar a definição de aplicativo", - "PUBLISH-DESCRIPTION":"Tem certeza que deseja publicar a definição do aplicativo \"{{name}}\"? Note que esta definição de aplicativo será versionada e o aplicativo de worflow será atualizado se existente.", - "PUBLISH-FIELD":"Publicar? Observe que, se a publicação estiver habilitado, esta definição de aplicativo será versionada e o aplicativo de workflow será atualizado se já existente.", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT":"Seu modelo de processo \"{{modelInAppName}}\" tem o mesmo identificador de \"{{processDefinitionKey}}\" com o processo previamente implantado \"{{conflictingModelName}}\" do aplicativo \"{{conflictingAppName}}\". Por favor, altere a propriedade \"id\" do modelo de processo para algo diferente.", - "PUBLISH-ERROR-PROCESS-ALREADY-USED":"Os seguintes modelos de processos já são utilizados em outro aplicativo. Isto está correto?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP":"Aplicativo", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS":"Aplicativo inválido: identificadores de processo duplicados foram encontrados (altere a propriedade de \"id\" dos modelos de processo com id duplicados):", - "DELETE-TITLE":"Excluir a definição de aplicativo", - "DELETE-DESCRIPTION":"Tem certeza que deseja excluir a definição do aplicativo \"{{name}}\"?", - "DELETE-DESCRIPTION-WITH-RUNTIME":"Tem certeza que deseja excluir a definição do aplicativo \"{{name}}\"? Note que esta definição de aplicativo foi implantada como uma tarefa de página inicial, o aplicativo será removido da página inicial.", - "DELETE-CASCADE-FALSE":"Somente apagar a versão atual desta definição de aplicativo (v{{version}})", - "DELETE-CASCADE-TRUE":"Também excluir todas as versões anteriores desta definição de aplicativo", - "HAS-CUSTOM-STENCILITEM":"O modelo \"{{modelName}}\" usa um estêncil com itens de estêncil personalizado. Não é possível usar este modelo em uma definição de aplicativo.", - "HAS-VALIDATIONERROR":"O modelo \"{{modelName}}\" tem erros de validação e não pode ser adicionado a uma definição de aplicativo. Abra o modelo no editor para ver mais detalhes sobre o(s) erro(s) de validação.", - "IMPORT-DESCRIPTION":"Por favor, procure ou arraste e solte uma definição de aplicativo com a extensão .zip", - "IMPORT-TITLE":"Importar um modelo de definição de aplicativo", - "IMPORT":{ - "DROPZONE":"Arraste e solte um arquivo de definição de aplicativo .zip", - "CANCEL-UPLOAD":"Cancelar o carregamento", - "RENEWIDM-IDS":"Renove os identificadores de usuário e grupo ao importar os passos e modelos BPMN. Isso é muitas vezes necessário ao importar a definição de aplicativo em um ambiente Flowable diferente. Isto vai tentar vincular o etapas humanas e tarefas de usuário para usuário e grupo correto no ambiente de destino.", - "ERROR":"Erro ao processar o arquivo de definição de aplicativo", - "NO-DROP":"Arrastar e soltar não suportado" - }, - "INCLUDE-MODELS-TITLE":"Modelos incluídos na definição do aplicativo" - }, - "ALERT":{ - "DELETE-CONFIRM":"Definição de Aplicativo excluída", - "PUBLISH-CONFIRM":"A definição de aplicativo foi publicada", - "PUBLISH-ERROR":"Não foi possível publicar a definição de aplicativo. Por favor, verifique a validade dos modelos de processos referenciados" - } - }, - "SHARE-INFO":{ - "ACTION":{ - "ADD":"Adicionar outra pessoa" - } - }, - "FORM-BUILDER":{ - "PALLETTE":{ - "TEXT":"Texto", - "PASSWORD": "Senha", - "MULTILINE-TEXT":"Texto de multilinhas", - "NUMBER":"Número", - "CHECKBOX":"Caixa de seleção", - "DATE":"Data", - "DROPDOWN":"Seleção simples", - "RADIO":"Botões de opção", - "PEOPLE":"Pessoas", - "GROUP-OF-PEOPLE":"Grupo de pessoas", - "UPLOAD":"Carregar", - "EXPRESSION":"Expressão", - "DECIMAL":"Decimal", - "HYPERLINK":"Hiperlink", - "SPACER": "Spacer", - "HORIZONTAL-LINE": "Horizontal line", - "HEADLINE": "Headline", - "HEADLINE-WITH-LINE":"Headline" - }, - "TABS":{ - "GENERAL":"Geral", - "OPTIONS":"Opções", - "UPLOAD-OPTIONS":"Opções de carregamento", - "ADVANCED-OPTIONS":"Avançado" - }, - "VERSION":"Versão {{version}}", - "LAST-UPDATED":"Última atualização feita por {{lastUpdatedBy}}, {{lastUpdated | dateformat}}", - "TITLE":{ - "DESIGN":"Desenho", - "OUTCOME":"Resultados" - }, - "POPUP":{ - "EDIT-TITLE":"Editar o campo '{{name}}'", - "EXPRESSION-TITLE":"Editar expressão" - }, - "MESSAGE":{ - "EMPTY-EXPRESSION":"(Nenhuma expressão)", - "EXPRESSION-HELP":"Você também pode exibir valores anteriormente apresentados sob qualquer formulário, como parte do texto, referenciando-os usando uma notação como segue ${myFieldId}.", - "OPTIONS-EXPRESSION-HELP": "Você pode usar uma expressão para preencher dinamicamente opções, por exemplo, fazendo referência a uma variável como esta ${optionsVariable}. A expressão precisa resultar em um objeto java (java.util.List com objetos Option) ou sua representação json." - }, - "LABEL":{ - "FUNCTIONAL-GROUP":"Selecione o grupo..", - "PERSON":"Selecione a pessoa.." - }, - "COMPONENT":{ - "LABEL":"Rótulo:", - "OVERRIDEID":"Substituir o id?", - "ID":"Id:", - "PLACEHOLDER":"Marcador:", - "OPTIONS":"Opções", - "RADIO-BUTTON-DEFAULT":"Opção 1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION":"Por favor, escolha uma...", - "DROPDOWN-EMPTY-VALUE-HELP":"Esta é a opção 'valor vazio'. Selecionar isto em tempo de execução significa dizer 'sem valor' ou 'vazio'. Isto é permitido para campos opcionais, mas não permitido para campos obrigatórios.", - "OPTIONS-EXPRESSION": "Expressão de opções:", - "OPTIONS-EXPRESSION-ENABLED": "Ativar expressão de opções", - "REQUIRED":"Obrigatório", - "READONLY":"Somente leitura", - "EXPRESSION":"Expressão", - "ADD-OPTION":"+ Adicionar uma nova opção", - "UPLOAD-ALLOW-MULTIPLE":"Permitir o upload de vários arquivos", - "MAX-LENGTH":"Comprimento máximo:", - "MIN-LENGTH":"Comprimento mínimo:", - "PASSWORD-UNMASK-OPTION": "opção de mascaramento/desmascarar senha", - "HYPERLINK-URL": "URL de hiperlink", - "REGEX-PATTERN":"Padrão Regex", - "MASK":{ - "TITLE":"Máscara de entrada", - "EXAMPLES":{ - "TITLE":"Exemplos:", - "NUMBER":"Qualquer número", - "LETTER":"Qualquer letra", - "NUMBERORLETTER":"Qualquer letra ou número", - "OPTIONAL":"Torna a máscara opcional (não valida)", - "PHONE":"Dinheiro" - } - } - }, - "OUTCOMES":{ - "DESCRIPTION":"Você pode definir várias saídas para esta tarefa. Quando concluir uma tarefa, os usuários seleciona uma das saídas disponíveis, que podem ser usados em, por exemplo, em uma condição futura no processo.", - "NO-OUTCOMES-OPTION":"Não use as saídas personalizados, apenas mostre um botão 'Completar'.", - "OUTCOMES-OPTION":"Use saídas personalizados para este formulário.", - "POSSIBLE-OUTCOMES":"Saídas possíveis", - "NEW-OUTCOME-PLACEHOLDER":"Insira uma nova saída", - "ADD":"Adicionar saída", - "REMOVE":"Excluir" - } - }, - "DECISION-TABLE-EDITOR":{ - "EMPTY-MESSAGES":{ - "NO-VARIABLE-SELECTED":"Indefinido" - }, - "POPUP":{ - "EXPRESSION-EDITOR":{ - "INPUT-TITLE":"Editar a coluna de entrada", - "INPUT-DESCRIPTION":"Selecione a variável de entrada como entrada para a coluna", - "OUTPUT-TITLE":"Editar a coluna de saída", - "OUTPUT-DESCRIPTION":"Selecione uma variável de saída existente ou crie uma nova", - "EXPRESSION-LABEL":"Rótulo de coluna:", - "EXPRESSION-PLACEHOLDER":"Digite um rótulo opcional", - "EXPRESSION-VARIABLE-NAME":"Nome da variável:", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER":"Entre com um nome de variável", - "OUTPUT-NEW-VARIABLE-ID":"ID da variável:", - "OUTPUT-NEW-VARIABLE-TYPE":"Tipo da variável:" - } - }, - "BUTTON-ADD-INPUT-LABEL":"Adicionar entrada", - "BUTTON-ADD-OUTPUT-LABEL":"Adicionar saída", - "BUTTON-ADD-RULE-LABEL":"Adicionar regra", - "BUTTON-MOVE-RULE-UPWARDS-LABEL":"Mover para cima", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL":"Mover para baixo", - "BUTTON-REMOVE-RULE-LABEL":"Excluir Regra", - "ALERT":{ - "EXPRESSION-VARIABLE-REQUIRED-ERROR":"Todas as expressões de entrada e saídas devem fazer referência a uma variável ou o campo do formulário.", - "SAVE-CONFIRM":"Tabela de decisão '{{name}}' salva" - } - }, - "TOUR":{ - "WELCOME-TITLE":"Bem-vindo, {{userName}}", - "WELCOME-CONTENT":"Esta uma pequena turnê do editor Flowable. Os próximos passos irão guiá-lo através de diferentes seções do aplicativo. Pressione a tecla ESC para parar a turnê a qualquer momento.", - "PALETTE-TITLE":"A paleta", - "PALETTE-CONTENT":"Todas as construções disponíveis para criar um processo de negócios podem ser encontradas aqui. Elas estão organizadas em grupos lógicos. Para abrir um grupo simplesmente clicar nele:", - "CANVAS-TITLE":"O Canvas", - "CANVAS-CONTENT":"Este é o espaço de trabalho no qual você cria seu processo de negócios. Arraste os elementos da paleta da esquerda e solte-os sobre esta tela para iniciar a modelagem.", - "DRAGDROP-TITLE":"Exemplo de arrastar e soltar", - "DRAGDROP-CONTENT":"Aqui está um exemplo de como você deve iniciar com a modelagem:", - "PROPERTIES-TITLE":"Propriedades", - "PROPERTIES-CONTENT":"Aqui você pode configurar as propriedades de uma construção de processo de negócios. Basta selecionar o item na tela e suas propriedades serão mostradas. Clique na propriedade se você quiser editá-la", - "TOOLBAR-TITLE":"A barra de ferramentas", - "TOOLBAR-CONTENT":"Todas as ações podem ser encontradas aqui: salvar ou validar um modelo, copiar e colar partes de um processo e assim por diante. Passe o mouse sobre os botões para obter uma descrição de uma ação.", - "END-TITLE":"Fim", - "END-CONTENT":"É isso! Agora você pode começar a modelagem de seus processos. Se você tiver alguma dúvida, não hesite em perguntar em Fórum Flowable " - }, - "FEATURE-TOUR":{ - "BENDPOINT":{ - "TITLE":"Tutorial de ponto curva", - "DESCRIPTION":"Quando você estiver se conectando as etapas do processo com o as outras usando o fluxo de sequência (as setas entre as etapas do processo), você pode achar que esses fluxo de sequência se cruzam, ou gostaria de organizá-los de forma diferente. Para fazer isso, você pode adicionar ou remover um ponto de curva para/de um fluxo de sequência.

Como mostrado abaixo na foto, primeiro, clique o 'Adicionar ponto de curva' e, em seguida, clique em um fluxo de sequência para adicioná-lo. Observe que o fluxo de sequência irá mostrar-lhe uma indicação sutil em verde para mostrar o ponto de curva pode ser adicionado lá.

Remover um ponto de curva novo segue um padrão semelhante: clique no botão 'remover ponto de curva' e clique em ponto de curva para removê-lo novamente." - } - }, - "ACTION.OK":"Ok", - "ACTION.SAVE":"Salvar", - "ACTION.SAVE-AND-CLOSE":"Salve e feche o editor", - "ACTION.SEND":"Enviar", - "ACTION.CANCEL":"Cancelar", - "ACTION.SELECT":"Selecione", - "ACTION.ADD":"Adicionar", - "ACTION.REMOVE":"Excluir", - "ACTION.MOVE.UP":"Mover a entrada para cima", - "ACTION.MOVE.DOWN":"Mover a entrada para baixo", - "TOOLBAR.ACTION.CLOSE":"Fechar o editor e voltar para a página de visão geral", - "TOOLBAR.ACTION.SAVE":"Salvar o modelo", - "TOOLBAR.ACTION.VALIDATE":"Validar o modelo", - "TOOLBAR.ACTION.CUT":"Recortar (selecione um ou mais elementos em seu processo de negócios)", - "TOOLBAR.ACTION.COPY":"Copiar (selecione um ou mais elementos em seu processo de negócios)", - "TOOLBAR.ACTION.PASTE":"Colar", - "TOOLBAR.ACTION.DELETE":"Excluir o elemento selecionado", - "TOOLBAR.ACTION.UNDO":"Desfazer", - "TOOLBAR.ACTION.REDO":"Refazer", - "TOOLBAR.ACTION.ZOOMIN":"Aumentar Zoom", - "TOOLBAR.ACTION.ZOOMOUT":"Diminuir o zoom", - "TOOLBAR.ACTION.ZOOMACTUAL":"Voltar para o tamanho real", - "TOOLBAR.ACTION.ZOOMFIT":"Enquadrar", - "TOOLBAR.ACTION.BENDPOINT.ADD":"Adicionar ponto de curva ao fluxo de sequência selecionado", - "TOOLBAR.ACTION.BENDPOINT.REMOVE":"Remover ponto de curva do fluxo de sequência selecionado", - "TOOLBAR.ACTION.ALIGNHORIZONTAL":"Alinhar o modelo horizontalmente", - "TOOLBAR.ACTION.ALIGNVERTICAL":"Alinhar o modelo verticalmente", - "TOOLBAR.ACTION.SAMESIZE":"Mesmo tamanho", - "TOOLBAR.ACTION.HELP":"Iniciar uma visita guiada", - "TOOLBAR.ACTION.FEEDBACK":"Fornecer feedback", - "FORM_TOOLBAR.ACTION.SAVE":"Salvar o modelo", - "APP_DEFINITION_TOOLBAR.ACTION.SAVE":"Salvar a definição de aplicativo", - "BUTTON.ACTION.DELETE.TOOLTIP":"Excluir o elemento do modelo", - "BUTTON.ACTION.MORPH.TOOLTIP":"Alterar o tipo do elemento", - "ELEMENT.AUTHOR":"Autor", - "ELEMENT.DATE_CREATED":"Data de criação", - "PROPERTY.REMOVED":"removido", - "PROPERTY.EMPTY":"Nenhum valor", - "PROPERTY.PROPERTY.EDIT.TITLE":"Altere o valor para ", - "PROPERTY.FEEDBACK.TITLE":"Por favor, nos envie seu feedback", - "PROPERTY.ASSIGNMENT.TITLE":"Atribuição", - "PROPERTY.ASSIGNMENT.TYPE":"Tipo", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE":"Identidades", - "PROPERTY.ASSIGNMENT.TYPE.STATIC":"Valores fixos", - "PROPERTY.ASSIGNMENT.ASSIGNEE":"Responsável", - "PROPERTY.ASSIGNMENT.MATCHING":"Use ↑ e ↓ para selecionar e pressione Enter para confirmar ou use o mouse", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER":"Insira um candidato", - "PROPERTY.ASSIGNMENT.EMPTY":"Nenhuma atribuição selecionada", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY":"Designado {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY":"{{length}} Usuários candidatos", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS":"Usuários candidatos", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY":"{{length}} Grupos candidatos", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS":"Grupos de candidatos", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY":"Usuário {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY":"Usuário {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY":"Campo {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY":"Iniciador do processo", - "PROPERTY.ASSIGNMENT.IDM.TYPE":"Atribuição", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS":"Nenhum usuário candidato selecionado...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS":"Nenhum grupo candidato selecionados...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR":"Atribuído ao iniciador do processo", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER":"Atribuído a um único usuário", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS":"Usuários candidatos", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS":"Grupos de candidatos", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE":"Permitir que o iniciador do processo complete a tarefa", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY":"{{length}} ouvintes da execução", - "PROPERTY.EXECUTIONLISTENERS.EMPTY":"Nenhum ouvinte de execução configurado", - "PROPERTY.EXECUTIONLISTENERS.EVENT":"Evento", - "PROPERTY.EXECUTIONLISTENERS.CLASS":"Classe", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER":"Digite um nome de classe", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION":"Expressão", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER":"Insira uma expressão", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION":"Expressão de atribuição", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER":"Insira uma expressão de atribuição", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED":"Nenhum ouvinte de execução selecionado", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME":"Nome", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER":"Digite um nome", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION":"Expressão", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER":"Insira uma expressão", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE":"Valor da string", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER":"Insira um valor da string", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING":"String", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER":"Entre com o texto", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION":"Implementação", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY":"Nenhum campo selecionado", - "PROPERTY.FIELDS":"{{length}} campos", - "PROPERTY.FIELDS.EMPTY":"Nenhum campo selecionado", - "PROPERTY.ASSIGNMENT.NONE" : "Nenhum...", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "Pesquisar usuário", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "Pesquisar grupo", - "PROPERTY.ASSIGNMENT.SEARCH": "Pesquisa: ", - "PROPERTY.FIELDS.NAME":"Nome", - "PROPERTY.FIELDS.NAME.PLACEHOLDER":"Digite um nome", - "PROPERTY.FIELDS.EXPRESSION":"Expressão", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER":"Insira uma expressão", - "PROPERTY.FIELDS.STRINGVALUE":"Valor da string", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER":"Insira um valor da string", - "PROPERTY.FIELDS.STRING":"String", - "PROPERTY.FIELDS.STRING.PLACEHOLDER":"Entre com o texto", - "PROPERTY.FIELDS.IMPLEMENTATION":"Implementação", - "PROPERTY.FORMPROPERTIES.VALUE":"{{length}} propriedades de formulário", - "PROPERTY.FORMPROPERTIES.EMPTY":"Não há propriedades de formulário selecionadas", - "PROPERTY.FORMPROPERTIES.ID":"Id", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER":"Entre com um id", - "PROPERTY.FORMPROPERTIES.NAME":"Nome", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER":"Digite um nome", - "PROPERTY.FORMPROPERTIES.TYPE":"Tipo", - "PROPERTY.FORMPROPERTIES.DATEPATTERN":"Padrão de data", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER":"Digite um padrão de data", - "PROPERTY.FORMPROPERTIES.VALUES":"Valores", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY":"Nenhum valor válido (enum) foi selecionado", - "PROPERTY.FORMPROPERTIES.VALUES.ID":"Id", - "PROPERTY.FORMPROPERTIES.VALUES.NAME":"Nome", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER":"Digite o id de um valor", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER":"Digite o nome do valor", - "PROPERTY.FORMPROPERTIES.EXPRESSION":"Expressão", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER":"Insira uma expressão", - "PROPERTY.FORMPROPERTIES.VARIABLE":"Variável", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER":"Insira uma variável", - "PROPERTY.FORMPROPERTIES.DEFAULT" : "default", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER" : "Insira uma default", - "PROPERTY.FORMPROPERTIES.REQUIRED":"Obrigatório", - "PROPERTY.FORMPROPERTIES.READABLE":"Possibilita Leitura", - "PROPERTY.FORMPROPERTIES.WRITABLE":"Possibilita Escrita", - "PROPERTY.INPARAMETERS.VALUE":"{{length}} parâmetros de entrada", - "PROPERTY.INPARAMETERS.EMPTY":"Nenhum parâmetro de entrada configurado", - "PROPERTY.OUTPARAMETERS.VALUE":"{{length}} parâmetros de saída", - "PROPERTY.OUTPARAMETERS.EMPTY":"Nenhum parâmetro de saída configurado", - "PROPERTY.PARAMETER.SOURCE":"Origem", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER":"Insira uma origem", - "PROPERTY.PARAMETER.SOURCEEXPRESSION":"Expressão de origem", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER":"Insira uma expressão de origem", - "PROPERTY.PARAMETER.TARGET":"Destino", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER":"Insira um destino", - "PROPERTY.PARAMETER.TARGETEXPRESSION" : "Expressão de destino", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER" : "Insira uma expressão de destino", - "PROPERTY.PARAMETER.EMPTY":"Nenhum parâmetro selecionado", - "PROPERTY.SUBPROCESSREFERENCE.EMPTY":"Nenhuma referência selecionada", - "PROPERTY.SUBPROCESSREFERENCE.TITLE":"Referência de subprocesso recolhida", - "PROPERTY.SUBPROCESSREFERENCE.ERROR.SUBPROCESS":"Houve um erro ao carregar os subprocessos. Tente novamente mais tarde", - "PROPERTY.SUBPROCESSREFERENCE.SUBPROCESS.LOADING":"Carregando subprocessos...", - "PROPERTY.SUBPROCESSREFERENCE.SUBPROCESS.EMPTY":"Esta pasta não contém subprocessos", - "PROPERTY.FORMREFERENCE.EMPTY":"Nenhuma referência selecionada", - "PROPERTY.FORMREFERENCE.TITLE":"Formulário de referência", - "PROPERTY.FORMREFERENCE.DESCRIPTION":"Referência a um formulário", - "PROPERTY.FORMREFERENCE.ERROR.FORM":"Houve um erro ao carregar o formulário. Tente novamente mais tarde", - "PROPERTY.FORMREFERENCE.FORM.LOADING":"Carregando formulários...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY":"Esta pasta não contém formulários", - "PROPERTY.TASKLISTENERS.VALUE":"{{length}} ouvintes de tarefa", - "PROPERTY.TASKLISTENERS.EMPTY":"Nenhum ouvintes tarefa configurado", - "PROPERTY.TASKLISTENERS.EVENT":"Evento", - "PROPERTY.TASKLISTENERS.CLASS":"Classe", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER":"Digite um nome de classe", - "PROPERTY.TASKLISTENERS.EXPRESSION":"Expressão", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER":"Insira uma expressão", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION":"Expressão de atribuição", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER":"Insira uma expressão de atribuição", - "PROPERTY.TASKLISTENERS.UNSELECTED":"Nenhum ouvinte de tarefas selecionado", - "PROPERTY.TASKLISTENERS.FIELDS.NAME":"Nome", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER":"Digite um nome", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION":"Expressão", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER":"Insira uma expressão", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE":"Valor da string", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER":"Insira um valor da string", - "PROPERTY.TASKLISTENERS.FIELDS.STRING":"String", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER":"Entre com o texto", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION":"Implementação", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY":"Nenhum campo selecionado", - "PROPERTY.EVENTLISTENERS.DISPLAY":"{{length}} ouvintes de evento", - "PROPERTY.EVENTLISTENERS.EMPTY":"Nenhum ouvintes de evento configurado", - "PROPERTY.EVENTLISTENERS.EVENTS":"Eventos", - "PROPERTY.EVENTLISTENERS.RETHROW":"Relançar o evento?", - "PROPERTY.EVENTLISTENERS.CLASS":"Classe", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER":"Digite um nome de classe", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION":"Expressão de atribuição", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER":"Insira uma expressão de atribuição", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE":"Tipo de entidade", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER":"Entre com um tipo de entidade", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE":"Relançar o tipo de evento", - "PROPERTY.EVENTLISTENERS.ERRORCODE":"Código de erro", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER":"Entre com um código de erro", - "PROPERTY.EVENTLISTENERS.MESSAGENAME":"Nome da mensagem", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER":"Entre com um nome de mensagem", - "PROPERTY.EVENTLISTENERS.SIGNALNAME":"Nome do sinal", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER":"Entre com o nome do sinal", - "PROPERTY.EVENTLISTENERS.UNSELECTED":"Nenhum ouvinte de evento selecionado", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE" : "{{length}} lifecycle listeners", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY" : "No lifecycle listeners configured", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT" : "Event", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE" : "Source state", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE" : "Target state", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS" : "Class", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER" : "Enter a classname", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION" : "Expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION" : "Delegate expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "Enter a delegate expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED" : "No task listener selected", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME" : "Name", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER" : "Enter a name", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION" : "Expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "Enter an expression", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE" : "String value", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "Enter a string value", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING" : "String", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER" : "Enter a string", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION" : "Implementation", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY" : "No Field selected", - "PROPERTY.SIGNALDEFINITIONS.DISPLAY":"{{length}} definições de sinal", - "PROPERTY.SIGNALDEFINITIONS.EMPTY":"Nenhuma definição de sinal configurada", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL":"Global", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE":"Instâncias de processos", - "PROPERTY.SIGNALDEFINITIONS.ID":"Id", - "PROPERTY.SIGNALDEFINITIONS.NAME":"Nome", - "PROPERTY.SIGNALDEFINITIONS.SCOPE":"Escopo", - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY":"{{length}} definições de mensagem", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY":"Nenhuma definição de mensagem configurada", - "PROPERTY.MESSAGEDEFINITIONS.ID":"Id", - "PROPERTY.MESSAGEDEFINITIONS.NAME":"Nome", - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY":"Nenhuma ordem de fluxo de sequência determinada", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY":"Conjunto de ordem de fluxo de sequência", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND":"Não foi encontrado nenhum fluxo de sequência de saída.", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION":"Defina a ordem em que o fluxo de sequência precisa ser analisado:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE":"Fluxo de sequência para {{targetType}} {{targetTitle}}", - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE":"Condição de fluxo de sequência", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC":"Expressão de condição", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY":"Nenhum conjunto de condição", - "PROPERTY.DUEDATE.EMPTY":"Sem data de vencimento", - "PROPERTY.DUEDATE.DEFINED":"Data de vencimento definida", - "PROPERTY.DUEDATE.TITLE":"Data de vencimento", - "PROPERTY.DUEDATE.EXPRESSION-LABEL":"Expressões de data de vencimento", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE":"Sem data de vencimento", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION":"Definição de expressão", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC":"Duração fixa após a criação da tarefa", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD":"Com base no campo", - "MODEL.SAVE.TITLE":"Salvar modelo", - "MODEL.VALIDATE.TITLE":"Resultados de validação", - "MODEL.NAME":"Nome", - "MODEL.KEY":"Chave", - "MODEL.DESCRIPTION":"Descrição", - "MODEL.SAVE.NEWVERSION":"Salvar como uma nova versão? Isto significa que você pode sempre voltar para uma versão anterior", - "MODEL.SAVE.COMMENT":"Comentário", - "MODEL.SAVE.SAVING":"Salvando modelo", - "MODEL.LASTMODIFIEDDATE":"Salvo pela última vez em", - "MODEL.SAVE.ERROR":"Erro inesperado: não foi possível salvar o modelo", - "MODEL.VALIDATIONERRORS":"Observe que o modelo contem erros de validação. Isto significa que o modelo não pode ser implantado no motor Flowable em seu estado atual.", - "MODEL.CONFLICT.WRITE":"Não foi possível salvar modelo: '{{userFullName}}' há mudanças para este modelo", - "MODEL.CONFLICT.WRITE.OPTIONS":"Selecione uma opção para resolver este conflito:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE":"Substituir outro modelo", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES":"Descartar minhas alterações", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS":"Salvar como novo modelo", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION":"Criar uma nova versão", - "MODEL.CONFLICT.SAVEAS":"Salvar como:", - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP":"Uma atividade está prestes a ser executado como uma compensação para outra atividade. O evento destina-se a atividade que está prestes a ser executado para compensação", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP":"Uma atividade foi concluída com sucesso", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP":"Uma atividade recebeu um evento de erro. Expedido antes que o erro real tenha sido recebido pela atividade", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP":"Um nova subscrição foi criada", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP":"Um único subscrição foi removida", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP":"Todas as subscrições no grupo relacionado foram excluídas. Nenhum evento individual será despachados por razões de desempenho", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP":"Uma tarefa foi atribuída. Isto é lançado como um evento ENTITY_UPDATED", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP":"Uma tarefa foi concluída. Expedida antes da entidade tarefa ser excluída", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP":"Quando um erro de BPMN foi acionado, mas não foi detectado dentro do processo", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP":"Foi criada uma nova variável", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP":"Uma variável existente foi excluída", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP":"Uma variável existente foi atualizada", - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY":"Nenhuma referência selecionada", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE":"Referência de tabela de decisão", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM":"Houve um erro ao carregar as tabelas de decisão. Tente novamente mais tarde", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING":"Carregando tabelas de decisão...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY":"Esta pasta não contém tabelas de decisão" -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/zh-CN.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/zh-CN.json deleted file mode 100644 index 1e0aca48..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/zh-CN.json +++ /dev/null @@ -1,2770 +0,0 @@ -{ - "GENERAL" : { - "MAIN-TITLE": "Flowable编辑器", - "NAVIGATION" : { - "PROCESSES": "流程", - "CASEMODELS": "案例模型", - "FORMS": "表单", - "DECISIONS": "决策表", - "APPS": "应用程序" - }, - "TITLE": { - "SELECT-GROUP" :"选择组", - "MATCHING-GROUPS": "匹配组", - "FILTER": "过滤", - "HISTORY": "历史" - }, - "ACTION": { - "LOGOUT": "退出", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST": "显示所有定义", - "CANCEL": "取消", - "CLOSE": "关闭", - "EDIT": "编辑", - "SAVE": "保存", - "OPEN": "打开", - "OK": "Ok", - "CONFIRM": "确认", - "CONFIRM-AND-CLOSE": "确认并且关闭", - "NEW-FORM": "新表单", - "CREATE-FORM": "创建表单", - "NEW-DECISION-TABLE": "新决策表", - "CREATE-DECISION-TABLE": "创建决策表" - }, - "MESSAGE": { - "SELECT-GROUP-HELP": "使用 ↑ 和 ↓ 选择并按回车确认", - "PEOPLE-NO-MATCHING-RESULTS": "没有找到匹配的用户", - "GROUP-NO-MATCHING-RESULTS": "没有找到匹配的组", - "GROUP-SOURCE-TYPE": "组源", - "GROUP-SOURCE-SEARCH-OPTION": "组搜索", - "GROUP-SOURCE-FIELD-OPTION": "表单字段" - }, - "OTHERS" : { - "PROCESS" : "流程", - "PROCESS_NAVIGATOR" : "流程导航", - "NO_STRUCTURAL_ELEMENTS_USED" : "未使用结构元素。" - } - }, - - "BPMN" : { - "TITLE": "BPMN 2.0标准工具", - "DESCRIPTION" : "BPMN流程编辑器", - "PROPERTYPACKAGES" : { - "PROCESS_IDPACKAGE" : { - "PROCESS_ID" : { - "TITLE" : "流程标识", - "DESCRIPTION" : "进程定义的唯一标识符。" - } - }, - "OVERRIDEIDPACKAGE" : { - "OVERRIDEID" : { - "TITLE" : "主键ID", - "DESCRIPTION" : "元素的唯一标识" - } - }, - "NAMEPACKAGE" : { - "NAME" : { - "TITLE" : "名称", - "DESCRIPTION" : "BPMN元素的描述名称." - } - }, - "DOCUMENTATIONPACKAGE" : { - "DOCUMENTATION" : { - "TITLE" : "描述信息", - "DESCRIPTION" : "BPMN元素的描述信息" - } - }, - "CATEGORYPACKAGE" : { - "CATEGORYDEFINITION" : { - "TITLE" : "分类", - "DESCRIPTION" : "BPMN元素的分类." - } - }, - "PROCESS_AUTHORPACKAGE" : { - "PROCESS_AUTHOR" : { - "TITLE" : "流程作者", - "DESCRIPTION" : "流程定义的作者." - } - }, - "PROCESS_VERSIONPACKAGE" : { - "PROCESS_VERSION" : { - "TITLE" : "流程版本字符串(仅备注)", - "DESCRIPTION" : "文档的目的为版本标识" - } - }, - "PROCESS_HISTORYLEVELPACKAGE" : { - "PROCESS_HISTORYLEVEL" : { - "TITLE" : "为此流程定义设置特定的历史级别", - "DESCRIPTION" : "为此流程定义设置特定的历史级别" - } - }, - "ISEXECUTABLEPACKAGE" : { - "ISEXECUTABLE" : { - "TITLE" : "是否可执行", - "DESCRIPTION" : "这个流程是可执行的吗?" - } - }, - "PROCESS_POTENTIALSTARTERUSERPACKAGE" : { - "PROCESS_POTENTIALSTARTERUSER" : { - "TITLE" : "流程启动者", - "DESCRIPTION" : "哪个用户,可以启动流程?" - } - }, - "PROCESS_POTENTIALSTARTERGROUPPACKAGE" : { - "PROCESS_POTENTIALSTARTERGROUP" : { - "TITLE" : "流程启动者组", - "DESCRIPTION" : "哪个组,可以启动流程?" - } - }, - "PROCESS_NAMESPACEPACKAGE" : { - "PROCESS_NAMESPACE" : { - "TITLE" : "目标命名空间", - "DESCRIPTION" : "流程定义的目标命名空间" - } - }, - "PROCESS_ISEAGEREXECUTIONFETCHPACKAGE" : { - "ISEAGEREXECUTIONFETCH" : { - "TITLE" : "即时执行抓取", - "DESCRIPTION" : "是否为该流程定义启用即时执行抓取" - } - }, - "ASYNCHRONOUSDEFINITIONPACKAGE" : { - "ASYNCHRONOUSDEFINITION" : { - "TITLE" : "异步", - "DESCRIPTION" : "定义异步的活动" - } - }, - "DATAPROPERTIESPACKAGE" : { - "DATAPROPERTIES" : { - "TITLE" : "数据对象", - "DESCRIPTION" : "数据对象属性的定义" - } - }, - "EXCLUSIVEDEFINITIONPACKAGE" : { - "EXCLUSIVEDEFINITION" : { - "TITLE" : "独占任务", - "DESCRIPTION" : "定义排它的活动" - } - }, - "EXECUTIONLISTENERSPACKAGE" : { - "EXECUTIONLISTENERS" : { - "TITLE" : "执行监听器", - "DESCRIPTION" : "活动、流程、流程跳转,开始、结事事件的监听器" - } - }, - "TASKLISTENERSPACKAGE" : { - "TASKLISTENERS" : { - "TITLE" : "任务监听器", - "DESCRIPTION" : "人工任务的监听器" - } - }, - "EVENTLISTENERSPACKAGE" : { - "EVENTLISTENERS" : { - "TITLE" : "事件监听器", - "DESCRIPTION" : "监听Flowable引擎的任何发生的事件. 同样可能是任何抛出的信号、信息、出错的事件。" - } - }, - "USERTASKASSIGNMENTPACKAGE" : { - "USERTASKASSIGNMENT" : { - "TITLE" : "分配用户", - "DESCRIPTION" : "分配任务给用户" - } - }, - "FORMPROPERTIESPACKAGE" : { - "FORMPROPERTIES" : { - "TITLE" : "动态表单属性", - "DESCRIPTION" : "定义带有属性列表的表单" - } - }, - "FORMKEYDEFINITIONPACKAGE" : { - "FORMKEYDEFINITION" : { - "TITLE" : "表单的标识", - "DESCRIPTION" : "表单的Key(指向关联的表单)" - } - }, - "FORMFIELDVALIDATIONPACKAGE" : { - "FORMFIELDVALIDATION" : { - "TITLE" : "验证表单字段", - "DESCRIPTION" : "验证表单提交上的表单字段。(允许的值是“true”、“false”或表达式)" - } - }, - "DUEDATEDEFINITIONPACKAGE" : { - "DUEDATEDEFINITION" : { - "TITLE" : "到期时间", - "DESCRIPTION" : "用户任务到期时间" - } - }, - "PRIORITYDEFINITIONPACKAGE" : { - "PRIORITYDEFINITION" : { - "TITLE" : "优先级", - "DESCRIPTION" : "用户任务的优先级" - } - }, - "SERVICETASKCLASSPACKAGE" : { - "SERVICETASKCLASS" : { - "TITLE" : "类", - "DESCRIPTION" : "实现服务任务逻辑的类" - } - }, - "SERVICETASKEXPRESSIONPACKAGE" : { - "SERVICETASKEXPRESSION" : { - "TITLE" : "表达式", - "DESCRIPTION" : "定义服务任务逻辑的表达式" - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE" : { - "SERVICETASKDELEGATEEXPRESSION" : { - "TITLE" : "委托表达式", - "DESCRIPTION" : "通过代理表达式定义任务服务逻辑" - } - }, - "SERVICETASKFIELDSPACKAGE" : { - "SERVICETASKFIELDS" : { - "TITLE" : "类中的字段", - "DESCRIPTION" : "字段扩展" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKRESULTVARIABLE" : { - "TITLE" : "结果变量名", - "DESCRIPTION" : "流程变量存储服务任务的执行结果" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKUSELOCALSCOPEFORRESULTVARIABLE" : { - "TITLE" : "对结果变量使用局部作用域", - "DESCRIPTION" : "标记需要将使用的结果变量保存为局部变量" - } - }, - "SERVICETASKTRIGGERABLEPACKAGE" : { - "SERVICETASKTRIGGERABLE" : { - "TITLE" : "将服务任务设置为可触发的", - "DESCRIPTION" : "将服务任务设置为可触发的" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "使結果變量瞬變", - "DESCRIPTION" : "指示存储結果變量变量瞬态的标志" - } - }, - "SCRIPTFORMATPACKAGE" : { - "SCRIPTFORMAT" : { - "TITLE" : "脚本格式", - "DESCRIPTION" : "脚本任务的脚本格式化" - } - }, - "SCRIPTTEXTPACKAGE" : { - "SCRIPTTEXT" : { - "TITLE" : "脚本", - "DESCRIPTION" : "脚本任务的脚本文本" - } - }, - "SCRIPTAUTOSTOREVARIABLESPACKAGE" : { - "SCRIPTAUTOSTOREVARIABLES" : { - "TITLE" : "自动存储变量", - "DESCRIPTION" : "自动存储流程的所有脚本变量" - } - }, - "SHELLCOMMANDPACKAGE" : { - "SHELLCOMMAND" : { - "TITLE" : "命令", - "DESCRIPTION" : "Shell任务命令" - } - }, - "SHELLARG1PACKAGE" : { - "SHELLARG1" : { - "TITLE" : "参数1", - "DESCRIPTION" : "Shell 命令的参数1" - } - }, - "SHELLARG2PACKAGE" : { - "SHELLARG2" : { - "TITLE" : "参数2", - "DESCRIPTION" : "Shell 命令的参数2" - } - }, - "SHELLARG3PACKAGE" : { - "SHELLARG3" : { - "TITLE" : "参数3", - "DESCRIPTION" : "Shell 命令的参数3" - } - }, - "SHELLARG4PACKAGE" : { - "SHELLARG4" : { - "TITLE" : "参数4", - "DESCRIPTION" : "Shell 命令的参数4" - } - }, - "SHELLARG5PACKAGE" : { - "SHELLARG5" : { - "TITLE" : "参数5", - "DESCRIPTION" : "Shell 命令的参数5" - } - }, - "SHELLWAITPACKAGE" : { - "SHELLWAIT" : { - "TITLE" : "等待", - "DESCRIPTION" : "等待shell命令执行结束的标志" - } - }, - "SHELLOUTPUTVARIABLEPACKAGE" : { - "SHELLOUTPUTVARIABLE" : { - "TITLE" : "输出变量", - "DESCRIPTION" : "存储shell 命令的输出变量" - } - }, - "SHELLERRORCODEVARIABLEPACKAGE" : { - "SHELLERRORCODEVARIABLE" : { - "TITLE" : "错误代码变量", - "DESCRIPTION" : "存储shell 命令错误代码的变量" - } - }, - "SHELLREDIRECTERRORPACKAGE" : { - "SHELLREDIRECTERROR" : { - "TITLE" : "重定向错误", - "DESCRIPTION" : "当设置为true,使用标准输出合并错误输出" - } - }, - "SHELLCLEANENVPACKAGE" : { - "SHELLCLEANENV" : { - "TITLE" : "清除环境变量", - "DESCRIPTION" : "清理shell执行环境" - } - }, - "SHELLDIRECTORYPACKAGE" : { - "SHELLDIRECTORY" : { - "TITLE" : "Shell目录", - "DESCRIPTION" : "Shell 进程工作目录" - } - }, - "RULETASK_RULESPACKAGE" : { - "RULETASK_RULES" : { - "TITLE" : "规则", - "DESCRIPTION" : "规则任务的规则" - } - }, - "RULETASK_VARIABLES_INPUTPACKAGE" : { - "RULETASK_VARIABLES_INPUT" : { - "TITLE" : "输入变量", - "DESCRIPTION" : "规则任务的输入变量" - } - }, - "RULETASK_EXCLUDEPACKAGE" : { - "RULETASK_EXCLUDE" : { - "TITLE" : "排除", - "DESCRIPTION" : "使用作为排它性的规则属性" - } - }, - "RULETASK_RESULTPACKAGE" : { - "RULETASK_RESULT" : { - "TITLE" : "结果变量", - "DESCRIPTION" : "规则任务的结果变量" - } - }, - "MAILTASKHEADERSPACKAGE" : { - "MAILTASKHEADERS" : { - "TITLE" : "邮件头", - "DESCRIPTION" : "行分隔邮件头(例如-x-attribute:value)。" - } - }, - "MAILTASKTOPACKAGE" : { - "MAILTASKTO" : { - "TITLE" : "接收人", - "DESCRIPTION" : "接收者,格式为邮件。多个接收者请用逗号分割的列表来定义" - } - }, - "MAILTASKFROMPACKAGE" : { - "MAILTASKFROM" : { - "TITLE" : "发件人", - "DESCRIPTION" : "发送者的邮箱.若不提供,默认将使用配置中的来源地址." - } - }, - "MAILTASKSUBJECTPACKAGE" : { - "MAILTASKSUBJECT" : { - "TITLE" : "主题", - "DESCRIPTION" : "Email中的主题" - } - }, - "MAILTASKCCPACKAGE" : { - "MAILTASKCC" : { - "TITLE" : "抄送", - "DESCRIPTION" : "抄送的Email地址,多个接收者请用逗号分隔开。" - } - }, - "MAILTASKBCCPACKAGE" : { - "MAILTASKBCC" : { - "TITLE" : "密送", - "DESCRIPTION" : "密送的Email地址. 多个接收者请用逗号分隔开" - } - }, - "MAILTASKTEXTPACKAGE" : { - "MAILTASKTEXT" : { - "TITLE" : "正文", - "DESCRIPTION" : "Email中的内容, 案例一需要发送纯文件的邮件. 可使用Html格式的邮件进行发送,若邮件的接收的客户端不支持这种格式,客户端可转为纯文本的邮件" - } - }, - "MAILTASKHTMLPACKAGE" : { - "MAILTASKHTML" : { - "TITLE" : "Html", - "DESCRIPTION" : "HTML中的一片段作为邮件的内容." - } - }, - "MAILTASKCHARSETPACKAGE" : { - "MAILTASKCHARSET" : { - "TITLE" : "字符集", - "DESCRIPTION" : "对于很多非英语语言来说,允许更改邮件的编码设置是必要的 " - } - }, - "HTTPTASKREQUESTMETHODPACKAGE" : { - "HTTPTASKREQUESTMETHOD" : { - "TITLE" : "请求方法", - "DESCRIPTION" : "请求方法(例如 - GET,POST,PUT等)。" - } - }, - "HTTPTASKREQUESTURLPACKAGE" : { - "HTTPTASKREQUESTURL" : { - "TITLE" : "请求 URL", - "DESCRIPTION" : "请求URL(例如 - http://flowable.org)。" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE" : { - "HTTPTASKREQUESTHEADERS" : { - "TITLE" : "请求头", - "DESCRIPTION" : "行分隔的HTTP请求标头(例如 - Content-Type:application/json)。" - } - }, - "HTTPTASKREQUESTBODYPACKAGE" : { - "HTTPTASKREQUESTBODYPACKAGE" : { - "TITLE" : "请求体", - "DESCRIPTION" : "请求正文(例如 - ${sampleBody})。" - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE" : { - "HTTPTASKREQUESTBODYENCODING" : { - "TITLE" : "请求体编码", - "DESCRIPTION" : "请求正文编码(例如-UTF-8)。" - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE" : { - "HTTPTASKREQUESTTIMEOUT" : { - "TITLE" : "请求超时时间(ms)", - "DESCRIPTION" : "请求超时(以毫秒为单位)(例如 - 5000)。" - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE" : { - "HTTPTASKDISALLOWREDIRECTS" : { - "TITLE" : "不允许重定向", - "DESCRIPTION" : "不允许HTTP重定向的标记。" - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE" : { - "HTTPTASKFAILSTATUSCODES" : { - "TITLE" : "失败时状态码", - "DESCRIPTION" : "逗号分隔的HTTP响应状态代码列表以重试,例如400,5XX。" - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE" : { - "HTTPTASKHANDLESTATUSCODES" : { - "TITLE" : "处理状态码", - "DESCRIPTION" : "要忽略的逗号分隔的HTTP响应状态代码列表,例如404,3XX。" - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE" : { - "HTTPTASKIGNOREEXCEPTION" : { - "TITLE" : "忽略异常", - "DESCRIPTION" : "标记以忽略异常。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT" : { - "TITLE" : "将响应保存为瞬态变量", - "DESCRIPTION" : "指示存储响应变量瞬态的标志" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE" : { - "HTTPTASKSAVERESPONSEASJSON" : { - "TITLE" : "将响应保存为JSON", - "DESCRIPTION" : "指示将响应变量存储为JSON变量而不是String的标志" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that when using parallel gateways multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the process is faster." - } - }, - "SKIPEXPRESSIONPACKAGE" : { - "SKIPEXPRESSION" : { - "TITLE" : "跳过表达式", - "DESCRIPTION" : "跳过与任务或关联关联的表达式执行与否。" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE" : { - "HTTPTASKRESPONSEVARIABLENAME" : { - "TITLE" : "响应变量名", - "DESCRIPTION" : "定义变量名称以存储http响应。" - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE" : { - "HTTPTASKSAVEREQUESTVARIABLES" : { - "TITLE" : "保存请求变量", - "DESCRIPTION" : "用于保存请求变量的标志。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERS" : { - "TITLE" : "保存响应状态、头", - "DESCRIPTION" : "用于保存响应状态,标题等的标志" - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE" : { - "HTTPTASKRESULTVARIABLEPREFIX" : { - "TITLE" : "结果变量的前缀", - "DESCRIPTION" : "执行变量名称的前缀。" - } - }, - "CALLACTIVITYCALLEDELEMENTPACKAGE" : { - "CALLACTIVITYCALLEDELEMENT" : { - "TITLE" : "被调用元素", - "DESCRIPTION" : "流程引用" - } - }, - "CALLACTIVITYCALLEDELEMENTTYPEPACKAGE" : { - "CALLACTIVITYCALLEDELEMENTTYPE" : { - "TITLE" : "被调用元素类型", - "DESCRIPTION" : "使用流程参考的类型。." - } - }, - "CALLACTIVITYINPARAMETERSPACKAGE" : { - "CALLACTIVITYINPARAMETERS" : { - "TITLE" : "输入参数", - "DESCRIPTION" : "定义输入参数" - } - }, - "CALLACTIVITYOUTPARAMETERSPACKAGE" : { - "CALLACTIVITYOUTPARAMETERS" : { - "TITLE" : "输出参数", - "DESCRIPTION" : "输出参数的定义" - } - }, - "CALLACTIVITYINHERITVARIABLESPACKAGE" : { - "CALLACTIVITYINHERITVARIABLES" : { - "TITLE" : "在子流程中继承变量", - "DESCRIPTION" : "在子流程中继承父流程变量。" - } - }, - "CALLACTIVITYSAMEDEPLOYMENTPACKAGE" : { - "CALLACTIVITYSAMEDEPLOYMENT" : { - "TITLE" : "从相同的部署中启动引用的流程", - "DESCRIPTION" : "使用同一部署中引用的流程。" - } - }, - "CALLACTIVITYFALLBACKTODEFAULTTENANTPACKAGE" : { - "CALLACTIVITYFALLBACKTODEFAULTTENANT" : { - "TITLE" : "回退到默认租户", - "DESCRIPTION" : "当前租户搜索失败时,在默认租户中按键查找定义。" - } - }, - "CALLACTIVITYPROCESSINSTANCENAMEPACKAGE" : { - "CALLACTIVITYPROCESSINSTANCENAME" : { - "TITLE" : "流程实例名称", - "DESCRIPTION" : "解析为子流程实例名称的表达式" - } - }, - "CALLACTIVITYINHERITBUSINESSKEYPACKAGE" : { - "CALLACTIVITYINHERITBUSINESSKEY" : { - "TITLE" : "继承业务键", - "DESCRIPTION" : "从父流程继承业务键。" - } - }, - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERSPACKAGE" : { - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERS" : { - "TITLE" : "对输出参数使用局部作用域", - "DESCRIPTION" : "对输出参数使用局部变量范围。" - } - }, - "CALLACTIVITYBUSINESSKEYPACKAGE" : { - "CALLACTIVITYBUSINESSKEY" : { - "TITLE" : "业务键表达式", - "DESCRIPTION" : "解析为子流程实例的业务键的表达式" - } - }, - "CALLACTIVITYCOMPLETEASYNCPACKAGE" : { - "CALLACTIVITYCOMPLETEASYNC" : { - "TITLE" : "完成异步", - "DESCRIPTION" : "如果设置,则子流程结束并完成调用活动是异步完成的。将并行多实例与具有异步任务的被调用流程定义一起使用时非常有用。" - } - }, - "CAMELTASKCAMELCONTEXTPACKAGE" : { - "CAMELTASKCAMELCONTEXT" : { - "TITLE" : "驼峰内容", - "DESCRIPTION" : "可选的Camel 上下文定义,若为空,则使用系统缺省的." - } - }, - "MULETASKENDPOINTURLPACKAGE" : { - "MULETASKENDPOINTURL" : { - "TITLE" : "终端url", - "DESCRIPTION" : "发送消息到Mule的必须的端点URL" - } - }, - "MULETASKLANGUAGEPACKAGE" : { - "MULETASKLANGUAGE" : { - "TITLE" : "语言", - "DESCRIPTION" : "必须的语言定义来解析装载的表达式,如JUEL." - } - }, - "MULETASKPAYLOADEXPRESSIONPACKAGE" : { - "MULETASKPAYLOADEXPRESSION" : { - "TITLE" : "有效载荷表达式", - "DESCRIPTION" : "发送至Mule的必须执行的消息定义" - } - }, - "MULETASKRESULTVARIABLEPACKAGE" : { - "MULETASKRESULTVARIABLE" : { - "TITLE" : "返回变量", - "DESCRIPTION" : "可选的装载返回的结果的变量" - } - }, - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "TITLE" : "流条件", - "DESCRIPTION" : "流程跳线的条件定义" - } - }, - "DEFAULTFLOWPACKAGE" : { - "DEFAULTFLOW" : { - "TITLE" : "默认流", - "DESCRIPTION" : "将序列流定义为默认值" - } - }, - "CONDITIONALFLOWPACKAGE" : { - "CONDITIONALFLOW" : { - "TITLE" : "条件流", - "DESCRIPTION" : "用条件定义序列流" - } - }, - "TIMERCYCLEDEFINITIONPACKAGE" : { - "TIMERCYCLEDEFINITION" : { - "TITLE" : "循环时间(例:R3/PT10H)", - "DESCRIPTION" : "定义ISO-8601时间周期" - } - }, - "TIMERDATEDEFINITIONPACKAGE" : { - "TIMERDATEDEFINITION" : { - "TITLE" : "开始时间(ISO-8601)", - "DESCRIPTION" : "定义(ISO-8601格式标准)的定时器." - } - }, - "TIMERDURATIONDEFINITIONPACKAGE" : { - "TIMERDURATIONDEFINITION" : { - "TITLE" : "持续时间(例:PT5M)", - "DESCRIPTION" : "定义(ISO-8601)持续的定时器" - } - }, - "TIMERENDDATEDEFINITIONPACKAGE" : { - "TIMERENDDATEDEFINITION" : { - "TITLE" : "结束时间(ISO-8601)", - "DESCRIPTION" : "定义带(ISO-8601 duration)定时器." - } - }, - "MESSAGEREFPACKAGE" : { - "MESSAGEREF" : { - "TITLE" : "消息引用", - "DESCRIPTION" : "定义消息的名字。" - } - }, - "SIGNALREFPACKAGE" : { - "SIGNALREF" : { - "TITLE" : "信号引用", - "DESCRIPTION" : "定义信号的名称" - } - }, - "COMPENSATIONACTIVITYREFPACKAGE" : { - "COMPENSATIONACTIVITYREF" : { - "TITLE" : "补偿活动参考", - "DESCRIPTION" : "定义活动参考。" - } - }, - "ERRORREFPACKAGE" : { - "ERRORREF" : { - "TITLE" : "错误引用", - "DESCRIPTION" : "定义错误名称" - } - }, - "ESCALATIONREFPACKAGE" : { - "ESCALATIONREF" : { - "TITLE" : "升级引用", - "DESCRIPTION" : "定义升级名称" - } - }, - "CONDITIONALEVENTPACKAGE" : { - "CONDITION" : { - "TITLE" : "条件表达式", - "DESCRIPTION" : "定义条件表达式." - } - }, - "CANCELACTIVITYPACKAGE" : { - "CANCELACTIVITY" : { - "TITLE" : "取消活动", - "DESCRIPTION" : "活动是否应取消?" - } - }, - "INITIATORPACKAGE" : { - "INITIATOR" : { - "TITLE" : "发起人", - "DESCRIPTION" : "流程的发起方。" - } - }, - "TEXTPACKAGE" : { - "TEXT" : { - "TITLE" : "文本", - "DESCRIPTION" : "文本批注的文本。" - } - }, - "MULTIINSTANCE_TYPEPACKAGE" : { - "MULTIINSTANCE_TYPE" : { - "TITLE" : "多实例类型", - "DESCRIPTION" : "重复的活动执行(并行或顺序)可以通过不同的循环类型显示。" - } - }, - "MULTIINSTANCE_CARDINALITYPACKAGE" : { - "MULTIINSTANCE_CARDINALITY" : { - "TITLE" : "基数(多实例)", - "DESCRIPTION" : "定义多实例的基数" - } - }, - "MULTIINSTANCE_COLLECTIONPACKAGE" : { - "MULTIINSTANCE_COLLECTION" : { - "TITLE" : "集合(多实例)", - "DESCRIPTION" : "定义多实例的集合" - } - }, - "MULTIINSTANCE_VARIABLEPACKAGE" : { - "MULTIINSTANCE_VARIABLE" : { - "TITLE" : "元素变量(多实例)", - "DESCRIPTION" : "为多实例定义变量元素" - } - }, - "MULTIINSTANCE_CONDITIONPACKAGE" : { - "MULTIINSTANCE_CONDITION" : { - "TITLE" : "完成条件(多实例)", - "DESCRIPTION" : "定义多实例的完成条件" - } - }, - "ISFORCOMPENSATIONPACKAGE" : { - "ISFORCOMPENSATION" : { - "TITLE" : "是否为补偿", - "DESCRIPTION" : "标识此活动是否用于补偿的标志。" - } - }, - "SEQUENCEFLOWORDERPACKAGE" : { - "SEQUENCEFLOWORDER" : { - "TITLE" : "流顺序", - "DESCRIPTION" : "流程走向的顺序" - } - }, - "SIGNALDEFINITIONSPACKAGE" : { - "SIGNALDEFINITIONS" : { - "TITLE" : "信号定义", - "DESCRIPTION" : "信号定义" - } - }, - "MESSAGEDEFINITIONSPACKAGE" : { - "MESSAGEDEFINITIONS" : { - "TITLE" : "消息定义", - "DESCRIPTION" : "消息定义" - } - }, - "ESCALATIONDEFINITIONSPACKAGE" : { - "ESCALATIONDEFINITIONS" : { - "TITLE" : "升级的定义", - "DESCRIPTION" : "升级的定义" - } - }, - - "EVENTREGISTRYPACKAGE" : { - "EVENTKEY" : { - "TITLE" : "事件key", - "DESCRIPTION" : "事件key定义" - }, - "EVENTNAME" : { - "TITLE" : "事件名称", - "DESCRIPTION" : "事件名称定义" - }, - "EVENTINPARAMETERS" : { - "TITLE" : "事件载体映射", - "DESCRIPTION" : "将流程变量映射到事件有效载体的属性" - }, - "EVENTOUTPARAMETERS" : { - "TITLE" : "从事件有效载体映射到流程", - "DESCRIPTION" : "将事件有效载体的属性映射到流程变量" - }, - "EVENTCORRELATIONPARAMETERS" : { - "TITLE" : "相关参数", - "DESCRIPTION" : "相关参数定义" - }, - "CHANNELKEY" : { - "TITLE" : "通道key", - "DESCRIPTION" : "通道key定义" - }, - "CHANNELNAME" : { - "TITLE" : "通道名称", - "DESCRIPTION" : "通道名称定义" - }, - "CHANNELTYPE" : { - "TITLE" : "通道类型", - "DESCRIPTION" : "通道类型定义" - }, - "CHANNELDESTINATION" : { - "TITLE" : "通道目的地", - "DESCRIPTION" : "通道目的地定义" - }, - "TRIGGEREVENTKEY" : { - "TITLE" : "触发事件key", - "DESCRIPTION" : "触发事件key定义" - }, - "TRIGGEREVENTNAME" : { - "TITLE" : "触发事件名称", - "DESCRIPTION" : "触发事件名称定义" - }, - "TRIGGERCHANNELKEY" : { - "TITLE" : "触发管道key", - "DESCRIPTION" : "触发管道key定义" - }, - "TRIGGERCHANNELNAME" : { - "TITLE" : "触发管道名称", - "DESCRIPTION" : "触发管道名称" - }, - "TRIGGERCHANNELTYPE" : { - "TITLE" : "触发通道类型", - "DESCRIPTION" : "触发通道类型定义" - }, - "TRIGGERCHANNELDESTINATION" : { - "TITLE" : "触发通道目的地", - "DESCRIPTION" : "触发通道目的地定义" - }, - "KEYDETECTIONFIXEDVALUE" : { - "TITLE" : "事件key固定值", - "DESCRIPTION" : "事件key固定值定义" - }, - "KEYDETECTIONJSONFIELD" : { - "TITLE" : "事件key json 字段", - "DESCRIPTION" : "事件key json 字段" - }, - "KEYDETECTIONJSONPOINTER" : { - "TITLE" : "事件key json 指针", - "DESCRIPTION" : "事件key json 指针" - } - }, - "ISTRANSACTIONPACKAGE" : { - "ISTRANSACTION" : { - "TITLE" : "是事务子流程", - "DESCRIPTION" : "标识此子流程是否为事务类型的标志。" - } - }, - "FORMREFERENCEPACKAGE" : { - "FORMREFERENCE" : { - "TITLE" : "表单引用", - "DESCRIPTION" : "关联到一个表单" - } - }, - "TERMINATEALLPACKAGE" : { - "TERMINATEALL" : { - "TITLE" : "终止所有", - "DESCRIPTION" : "启用以终止流程实例" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE" : { - "DECISIONTASKDECISIONTABLEREFERENCE" : { - "TITLE" : "决策表参考", - "DESCRIPTION" : "设置决策表引用" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE" : { - "DECISIONTASKTHROWERRORONNOHITS" : { - "TITLE" : "如果未命中任何规则,则引发错误", - "DESCRIPTION" : "如果未命中决策表的规则,因而找不到结果,则应引发错误。" - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE" : { - "DECISIONTASKFALLBACKTODEFAULTTENANT" : { - "TITLE" : "回退到默认租户", - "DESCRIPTION" : "当上一次尝试用租户查找决策定义失败时,查找不带租户的决策定义。" - } - }, - "INTERRUPTINGPACKAGE" : { - "INTERRUPTING" : { - "TITLE" : "中断", - "DESCRIPTION" : "是否应终止所有父级执行?" - } - }, - "COMPLETIONCONDITIONPACKAGE" : { - "COMPLETIONCONDITION" : { - "TITLE" : "完成条件", - "DESCRIPTION" : "自组网子流程的完成条件" - } - }, - "ORDERINGPACKAGE" : { - "ORDERING" : { - "TITLE" : "排序", - "DESCRIPTION" : "自组网子流程的排序" - } - }, - "CANCELREMAININGINSTANCESPACKAGE" : { - "CANCELREMAININGINSTANCES" : { - "TITLE" : "取消剩余的实例", - "DESCRIPTION" : "取消自组网子流程的剩余实例?" - } - } - - }, - "STENCILS" : { - "GROUPS" : { - "STARTEVENTS" : "启动事件", - "ENDEVENTS" : "结束事件", - "DIAGRAM" : "图解", - "ACTIVITIES" : "活动", - "STRUCTURAL" : "结构", - "GATEWAYS" : "网关", - "BOUNDARYEVENTS" : "边界事件", - "INTERMEDIATECATCHINGEVENTS" : "中间捕捉事件", - "INTERMEDIATETHROWINGEVENTS" : "中间抛出事件", - "SWIMLANES" : "泳道", - "CONNECTINGOBJECTS" : "连接对象", - "ARTIFACTS" : "工件" - }, - "BPMNDIAGRAM" : { - "TITLE" : "BPMN流程图", - "DESCRIPTION" : "BPMN 2.0 流程图." - }, - "STARTNONEEVENT" : { - "TITLE" : "空启动事件", - "DESCRIPTION" : "无特定触发器的启动事件" - }, - "STARTTIMEREVENT" : { - "TITLE" : "定时器启动事件", - "DESCRIPTION" : "带定时器触发的启动事件" - }, - "STARTSIGNALEVENT" : { - "TITLE" : "信号启动事件", - "DESCRIPTION" : "通过信号触发启动事件" - }, - "STARTMESSAGEEVENT" : { - "TITLE" : "消息启动事件", - "DESCRIPTION" : "通过消息触发启动事件" - }, - "STARTCONDITIONALEVENT" : { - "TITLE" : "条件启动事件", - "DESCRIPTION" : "通过条件触发启动事件" - }, - "STARTERROREVENT" : { - "TITLE" : "异常启动事件", - "DESCRIPTION" : "用于捕获BPMN抛出的异常启动事件" - }, - "STARTESCALATIONEVENT" : { - "TITLE" : "升级开始事件", - "DESCRIPTION" : "捕获抛出的BPMN升级的启动事件" - }, - "STARTEVENTREGISTRYEVENT" : { - "TITLE" : "注册开始事件", - "DESCRIPTION" : "注册开始事件" - }, - "STARTVARIABLELISTENEREVENT" : { - "TITLE" : "变量监听启动事件", - "DESCRIPTION" : "监听变量变更的启动事件" - }, - - "USERTASK" : { - "TITLE" : "用户任务", - "DESCRIPTION" : "分配给特定人的任务" - }, - "SERVICETASK" : { - "TITLE" : "服务任务", - "DESCRIPTION" : "带有服务逻辑的自动任务" - }, - "SCRIPTTASK" : { - "TITLE" : "脚本任务", - "DESCRIPTION" : "带有脚本逻辑的自动任务" - }, - "BUSINESSRULE" : { - "TITLE" : "业务规则任务", - "DESCRIPTION" : "带有业务规则的自动任务" - }, - "RECEIVETASK" : { - "TITLE" : "接收任务", - "DESCRIPTION" : "等待接收信号来触发的任务" - }, - "RECEIVEEVENTTASK" : { - "TITLE" : "接收事件任务", - "DESCRIPTION" : "接收事件任务" - }, - "MANUALTASK" : { - "TITLE" : "手动任务", - "DESCRIPTION" : "不带任何逻辑的自动任务" - }, - "MAILTASK" : { - "TITLE" : "邮件任务", - "DESCRIPTION" : "邮件任务" - }, - "CAMELTASK" : { - "TITLE" : "驼峰任务", - "DESCRIPTION" : "发送消息给Camel容器的任务" - }, - "HTTPTASK" : { - "TITLE" : "Http任务", - "DESCRIPTION" : "Http任务" - }, - "MULETASK" : { - "TITLE" : "Mule任务", - "DESCRIPTION" : "An task that sends a message to Mule" - }, - "SENDTASK" : { - "TITLE" : "发送任务", - "DESCRIPTION" : "发送消息的任务" - }, - "DECISIONTASK" : { - "TITLE" : "决策任务", - "DESCRIPTION" : "使用Flowable DMN规则引擎的任务" - }, - "SHELLTASK" : { - "TITLE" : "Shell任务", - "DESCRIPTION" : "具有shell批处理逻辑的自动任务" - }, - "SUBPROCESS" : { - "TITLE" : "子流程", - "DESCRIPTION" : "子流程范围" - }, - "SENDEVENTTASK" : { - "TITLE" : "事件发送任务", - "DESCRIPTION" : "事件发送任务" - }, - "EXTERNALWORKERTASK" : { - "TITLE" : "外部工作任务", - "DESCRIPTION" : "外部工作任务" - }, - - "COLLAPSEDSUBPROCESS" : { - "TITLE" : "折叠子流程", - "DESCRIPTION" : "子流程范围" - }, - "EVENTSUBPROCESS" : { - "TITLE" : "事件子流程", - "DESCRIPTION" : "事件子流程范围" - }, - "CALLACTIVITY" : { - "TITLE" : "调用活动", - "DESCRIPTION" : "一个调用活动" - }, - "EXCLUSIVEGATEWAY" : { - "TITLE" : "排他网关", - "DESCRIPTION" : "一个选择的网关" - }, - "PARALLELGATEWAY" : { - "TITLE" : "并行网关", - "DESCRIPTION" : "一个并行的网关" - }, - "INCLUSIVEGATEWAY" : { - "TITLE" : "包容网关", - "DESCRIPTION" : "一个包容性网关" - }, - "EVENTGATEWAY" : { - "TITLE" : "事件网关", - "DESCRIPTION" : "一个事件网关" - }, - "BOUNDARYCONDITIONALEVENT" : { - "TITLE" : "边界条件事件", - "DESCRIPTION" : "捕获指定条件的边界事件" - }, - "BOUNDARYERROREVENT" : { - "TITLE" : "边界错误事件", - "DESCRIPTION" : "捕捉bpmn错误的边界事件" - }, - "BOUNDARYESCALATIONEVENT" : { - "TITLE" : "边界升级事件", - "DESCRIPTION" : "捕获BPMN升级的边界事件" - }, - "BOUNDARYTIMEREVENT" : { - "TITLE" : "边界计时器事件", - "DESCRIPTION" : "具有计时器触发器的边界事件" - }, - "BOUNDARYSIGNALEVENT" : { - "TITLE" : "边界信号事件", - "DESCRIPTION" : "一个信号触发的边界事件" - }, - "BOUNDARYMESSAGEEVENT" : { - "TITLE" : "边界消息事件", - "DESCRIPTION" : "一个边界消息事件" - }, - "BOUNDARYCANCELEVENT" : { - "TITLE" : "边界取消事件", - "DESCRIPTION" : "一个边界取消事件" - }, - "BOUNDARYEVENTREGISTRYEVENT" : { - "TITLE" : "边界注册事件", - "DESCRIPTION" : "边界注册事件" - }, - "BOUNDARYVARIABLELISTENEREVENT" : { - "TITLE" : "边界变量监听事件", - "DESCRIPTION" : "边界变量监听事件" - }, - "BOUNDARYCOMPENSATIONEVENT" : { - "TITLE" : "边界补偿事件", - "DESCRIPTION" : "边界补偿事件" - }, - "CATCHTIMEREVENT" : { - "TITLE" : "中间计时器捕获事件", - "DESCRIPTION" : "使用计时器触发器的中间捕获事件" - }, - "CATCHSIGNALEVENT" : { - "TITLE" : "中间信号捕获事件", - "DESCRIPTION" : "带有信号触发器的中间捕获事件" - }, - "CATCHMESSAGEEVENT" : { - "TITLE" : "中间消息捕获事件", - "DESCRIPTION" : "带有消息触发器的中间捕获事件" - }, - "CATCHCONDITIONALEVENT" : { - "TITLE" : "中间条件捕获事件", - "DESCRIPTION" : "带有条件触发器的中间捕获事件" - }, - "CATCHEVENTREGISTRYEVENT" : { - "TITLE" : "中间事件注册捕获事件", - "DESCRIPTION" : "中间事件注册捕获事件" - }, - "CATCHVARIABLELISTENEREVENT": { - "TITLE" : "中间变量监听事件", - "DESCRIPTION" : "中间变量监听事件" - }, - "THROWNONEEVENT" : { - "TITLE" : "中间无抛出事件", - "DESCRIPTION" : "没有特定触发器的中间事件" - }, - "THROWSIGNALEVENT" : { - "TITLE" : "中间信号抛出事件", - "DESCRIPTION" : "带有信号触发器的中间事件" - }, - "THROWESCALATIONEVENT" : { - "TITLE" : "中间升级抛出事件", - "DESCRIPTION" : "具有升级触发器的中间事件" - }, - "THROWCOMPENSATIONEVENT": { - "TITLE" : "中间补偿投掷事件", - "DESCRIPTION" : "带有补偿触发器的中间事件" - }, - "ENDNONEEVENT" : { - "TITLE" : "结束事件", - "DESCRIPTION" : "没有特定触发器的结束事件" - }, - "ENDERROREVENT" : { - "TITLE" : "结束错误事件", - "DESCRIPTION" : "引发错误事件的结束事件" - }, - "ENDESCALATIONEVENT" : { - "TITLE" : "结束升级事件", - "DESCRIPTION" : "抛出升级事件的结束时间" - }, - "ENDCANCELEVENT" : { - "TITLE" : "结束取消事件", - "DESCRIPTION" : "取消结束事件" - }, - "ENDTERMINATEEVENT" : { - "TITLE" : "结束终止事件", - "DESCRIPTION" : "终止结束事件" - }, - "POOL" : { - "TITLE" : "池", - "DESCRIPTION" : "用于构造流程定义的池" - }, - "LANE" : { - "TITLE" : "泳道", - "DESCRIPTION" : "构建流程定义的泳道" - }, - "SEQUENCEFLOW" : { - "TITLE" : "顺序流", - "DESCRIPTION" : "序列流定义了活动的执行顺序。" - }, - "MESSAGEFLOW" : { - "TITLE" : "消息流", - "DESCRIPTION" : "用于连接不同池中的元素的消息流。" - }, - "ASSOCIATION" : { - "TITLE" : "关联", - "DESCRIPTION" : "将文本注释与元素关联。" - }, - "DATAASSOCIATION" : { - "TITLE" : "数据关联", - "DESCRIPTION" : "将数据元素与活动关联。" - }, - "TEXTANNOTATION" : { - "TITLE" : "文本注释", - "DESCRIPTION" : "用描述文本注释元素。" - }, - "DATASTORE" : { - "TITLE" : "数据存储", - "DESCRIPTION" : "对数据存储的引用。" - }, - "ADHOCSUBPROCESS" : { - "TITLE" : "自组网子流程", - "DESCRIPTION" : "自组网子流程" - } - } - }, - - "CMMN" : { - "TITLE": "CMMN编辑器", - "DESCRIPTION": "CMMN案例编辑器", - "PROPERTYPACKAGES": { - "CASE_IDPACKAGE": { - "CASE_ID": { - "TITLE": "案例标识符", - "DESCRIPTION": "案例定义的唯一标识符。" - } - }, - "OVERRIDEIDPACKAGE": { - "OVERRIDEID": { - "TITLE": "主键Id", - "DESCRIPTION": "元素的唯一标识符" - } - }, - "NAMEPACKAGE": { - "NAME": { - "TITLE": "案例名称", - "DESCRIPTION": "CMMN元素的描述性名称。" - } - }, - "DOCUMENTATIONPACKAGE": { - "DOCUMENTATION": { - "TITLE": "描述文档", - "DESCRIPTION": "CMMN元素的描述性名称。" - } - }, - "BLOCKINGPACKAGE": { - "ISBLOCKING": { - "TITLE": "阻塞", - "DESCRIPTION": "布尔属性,默认为true。如果为false,则任务将在执行任何关联逻辑后自动完成任务" - }, - "ISBLOCKINGEXPRESSION": { - "TITLE": "阻塞表达式", - "DESCRIPTION": "在运行时控制此任务是否阻塞的表达式。设置后,将忽略阻塞属性的值。" - } - }, - "CASE_INITIATORVARIABLENAMEPACKAGE": { - "CASE_INITIATORVARIABLENAME": { - "TITLE": "启动器变量名称", - "DESCRIPTION": "设置要用于案例启动程序值的变量名称。" - } - }, - "CASE_AUTHORPACKAGE": { - "CASE_AUTHOR": { - "TITLE": "案例作者", - "DESCRIPTION": "案例定义的作者" - } - }, - "CASE_VERSIONPACKAGE": { - "CASE_VERSION": { - "TITLE": "案例版本字符串(仅文档)", - "DESCRIPTION": "版本标识符用于文档目的。" - } - }, - "CASE_NAMESPACEPACKAGE": { - "CASE_NAMESPACE": { - "TITLE": "目标命名空间", - "DESCRIPTION": "案例定义的目标名称空间。" - } - }, - "USERTASKASSIGNMENTPACKAGE": { - "USERTASKASSIGNMENT": { - "TITLE": "分配任务", - "DESCRIPTION": "用户任务的分配定义" - } - }, - "TASKLISTENERSPACKAGE": { - "TASKLISTENERS": { - "TITLE": "任务监听器", - "DESCRIPTION": "人工任务的监听器" - } - }, - "FORMPROPERTIESPACKAGE": { - "FORMPROPERTIES": { - "TITLE": "表单属性", - "DESCRIPTION": "具有表单属性列表的表单定义" - } - }, - "FORMKEYDEFINITIONPACKAGE": { - "FORMKEYDEFINITION": { - "TITLE": "表单键", - "DESCRIPTION": "提供对表单的引用的表单键。" - } - }, - "FORMFIELDVALIDATIONPACKAGE": { - "FORMFIELDVALIDATION": { - "TITLE": "验证表单字段", - "DESCRIPTION": "在表单提交时验证表单字段。(允许值为“true”、“false”或表达式)" - } - }, - "DUEDATEDEFINITIONPACKAGE": { - "DUEDATEDEFINITION": { - "TITLE": "到期日", - "DESCRIPTION": "用户任务的截止日期" - } - }, - "PRIORITYDEFINITIONPACKAGE": { - "PRIORITYDEFINITION": { - "TITLE": "优先级", - "DESCRIPTION": "用户任务的优先级。" - } - }, - "SERVICETASKCLASSPACKAGE": { - "SERVICETASKCLASS": { - "TITLE": "类", - "DESCRIPTION": "实现服务任务逻辑的类。" - } - }, - "SERVICETASKEXPRESSIONPACKAGE": { - "SERVICETASKEXPRESSION": { - "TITLE": "表达式", - "DESCRIPTION": "用表达式定义的服务任务逻辑。" - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE": { - "SERVICETASKDELEGATEEXPRESSION": { - "TITLE": "委托表达式", - "DESCRIPTION": "用委托表达式定义的服务任务逻辑。" - } - }, - "SERVICETASKFIELDSPACKAGE": { - "SERVICETASKFIELDS": { - "TITLE": "类字段", - "DESCRIPTION": "字段扩展" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE": { - "SERVICETASKRESULTVARIABLE": { - "TITLE": "结果变量名称", - "DESCRIPTION": "存储服务任务结果的进程变量名。" - } - }, - "ASYNCPACKAGE": { - "ISASYNC": { - "TITLE": "异步", - "DESCRIPTION": "指示是否需要异步执行任务。" - }, - "ISEXCLUSIVE": { - "TITLE": "独占", - "DESCRIPTION": "指示是否必须以独占方式执行异步任务" - } - }, - "MAILTASKHEADERSPACKAGE": { - "MAILTASKHEADERS": { - "TITLE": "报头", - "DESCRIPTION": "行分隔邮件头(例如 - X-Attribute: value)" - } - }, - "MAILTASKTOPACKAGE": { - "MAILTASKTO": { - "TITLE": "接收者", - "DESCRIPTION": "如果是电子邮件,则为收件人。在逗号分隔的列表中定义了多个收件人。" - } - }, - "MAILTASKFROMPACKAGE": { - "MAILTASKFROM": { - "TITLE": "发件者", - "DESCRIPTION": "发件人电子邮件地址。如果未提供,则使用从地址配置的默认值。" - } - }, - "MAILTASKSUBJECTPACKAGE": { - "MAILTASKSUBJECT": { - "TITLE": "主题", - "DESCRIPTION": "电子邮件的主题。" - } - }, - "MAILTASKCCPACKAGE": { - "MAILTASKCC": { - "TITLE": "抄送", - "DESCRIPTION": "电子邮件的抄送。在逗号分隔的列表中定义了多个收件人" - } - }, - "MAILTASKBCCPACKAGE": { - "MAILTASKBCC": { - "TITLE": "密送", - "DESCRIPTION": "电子邮件的密件抄送。在逗号分隔的列表中定义了多个收件人" - } - }, - "MAILTASKTEXTPACKAGE": { - "MAILTASKTEXT": { - "TITLE": "文本", - "DESCRIPTION": "电子邮件的内容,以防需要发送不丰富的普通电子邮件。可与HTML结合使用,用于不支持丰富内容的电子邮件客户端。然后,客户机将返回到此文本唯一的备选方案。" - } - }, - "MAILTASKHTMLPACKAGE": { - "MAILTASKHTML": { - "TITLE": "Html", - "DESCRIPTION": "一段HTML,它是电子邮件的内容。" - } - }, - "MAILTASKCHARSETPACKAGE": { - "MAILTASKCHARSET": { - "TITLE": "字符集", - "DESCRIPTION": "允许更改电子邮件的字符集,这对于许多非英语语言是必需的。" - } - }, - "TEXTPACKAGE": { - "TEXT": { - "TITLE": "文本", - "DESCRIPTION": "文本批注的文本。" - } - }, - "FORMREFERENCEPACKAGE": { - "FORMREFERENCE": { - "TITLE": "表单引用", - "DESCRIPTION": "一个表单的引用" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONTABLEREFERENCE": { - "TITLE": "决策表参考", - "DESCRIPTION": "设置决策表引用" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE": { - "DECISIONTASKTHROWERRORONNOHITS": { - "TITLE": "如果未命中任何规则,则抛出错误", - "DESCRIPTION": "如果未命中决策表的规则,因而找不到结果,则应抛出错误。" - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE": { - "DECISIONTASKFALLBACKTODEFAULTTENANT": { - "TITLE": "回退到默认租户", - "DESCRIPTION": "当上一次尝试用租户查找决策定义失败时,查找不带租户的决策定义。" - } - }, - "HTTPTASKREQUESTMETHODPACKAGE": { - "HTTPTASKREQUESTMETHOD": { - "TITLE": "请求方法", - "DESCRIPTION": "请求方法(例如GET、POST、PUT等)。" - } - }, - "HTTPTASKREQUESTURLPACKAGE": { - "HTTPTASKREQUESTURL": { - "TITLE": "请求URL", - "DESCRIPTION": "请求URL(例如-http://flowable.org)。" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE": { - "HTTPTASKREQUESTHEADERS": { - "TITLE": "请求头", - "DESCRIPTION": "行分隔的HTTP请求头(例如-content-type:application/json)。" - } - }, - "HTTPTASKREQUESTBODYPACKAGE": { - "HTTPTASKREQUESTBODY": { - "TITLE": "请求正文", - "DESCRIPTION": "请求主体(例如-$samplebody)。" - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE": { - "HTTPTASKREQUESTBODYENCODING": { - "TITLE": "请求正文编码", - "DESCRIPTION": "Request body encoding (For example- UTF-8)." - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE": { - "HTTPTASKREQUESTTIMEOUT": { - "TITLE": "请求超时(ms)", - "DESCRIPTION": "请求超时(毫秒)(例如-5000)。" - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE": { - "HTTPTASKDISALLOWREDIRECTS": { - "TITLE": "不允许重定向", - "DESCRIPTION": "禁止HTTP重定向的标志。" - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE": { - "HTTPTASKFAILSTATUSCODES": { - "TITLE": "故障状态代码", - "DESCRIPTION": "以逗号分隔的要重试的HTTP响应状态代码列表,例如400,5xx。" - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE": { - "HTTPTASKHANDLESTATUSCODES": { - "TITLE": "处理状态代码", - "DESCRIPTION": "要忽略的HTTP响应状态代码的逗号分隔列表,例如404、3xx。" - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE": { - "HTTPTASKIGNOREEXCEPTION": { - "TITLE": "忽略异常", - "DESCRIPTION": "忽略异常的标志。" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE": { - "HTTPTASKRESPONSEVARIABLENAME": { - "TITLE": "响应变量名", - "DESCRIPTION": "定义存储HTTP响应的变量名。" - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE": { - "HTTPTASKSAVEREQUESTVARIABLES": { - "TITLE": "保存请求变量", - "DESCRIPTION": "保存请求变量的标志。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERS": { - "TITLE": "保存响应状态,标题", - "DESCRIPTION": "保存响应状态、标题等的标志。" - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE": { - "HTTPTASKRESULTVARIABLEPREFIX": { - "TITLE": "结果变量前缀", - "DESCRIPTION": "执行变量名称的前缀。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT": { - "TITLE": "使結果變量瞬态變的", - "DESCRIPTION": "指示存储响应变量瞬态的标志" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE": { - "HTTPTASKSAVERESPONSEASJSON": { - "TITLE": "将响应另存为JSON", - "DESCRIPTION": "指示将响应变量存储为JSON变量而不是字符串的标志" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the case is faster." - } - }, - "CASETASKCASEREFERENCEPACKAGE": { - "CASETASKCASEREFERENCE": { - "TITLE": "案例参考", - "DESCRIPTION": "设置案例参考" - } - }, - "PROCESSTASKPROCESSREFERENCEPACKAGE": { - "PROCESSTASKPROCESSREFERENCE": { - "TITLE": "工艺参考", - "DESCRIPTION": "设置进程引用" - } - }, - "FALLBACKTODEFAULTTENANTPACKAGE": { - "FALLBACKTODEFAULTTENANT": { - "TITLE": "回退到默认租户", - "DESCRIPTION": "当指定租户中的键找不到定义时,使用默认租户作为回退" - } - }, - "PROCESSTASKINPARAMETERSPACKAGE": { - "PROCESSTASKINPARAMETERS": { - "TITLE": "在参数中", - "DESCRIPTION": "输入参数的定义" - } - }, - "PROCESSTASKOUTPARAMETERSPACKAGE": { - "PROCESSTASKOUTPARAMETERS": { - "TITLE": "输出参数", - "DESCRIPTION": "输出参数的定义" - } - }, - "TIMEREXPRESSIONPACKAGE": { - "TIMEREXPRESSION": { - "TITLE": "计时器表达式", - "DESCRIPTION": "一个iso-8601字符串或表达式,它解析为iso-8601字符串或java.util.Date。" - } - }, - "TIMERSTARTTRIGGERPACKAGE": { - "TIMERSTARTTRIGGERSOURCEREF": { - "TITLE": "启动触发计划项", - "DESCRIPTION": "对计划项的引用,为其配置的标准事件需要发生才能启动计时器(可选)" - }, - "TRANSITIONEVENT": { - "TITLE": "启动触发器转换事件", - "DESCRIPTION": "过渡事件的类型. 仅在设置开始触发计划项时使用" - } - }, - "DECISIONTASKDECISIONREFERENCEPACKAGE": { - "DECISIONTASKDECISIONREFERENCE": { - "TITLE": "决策参考", - "DESCRIPTION": "设置决策参考" - } - }, - "IFPARTCONDITIONPACKAGE": { - "IFPARTCONDITION": { - "TITLE": "条件", - "DESCRIPTION": "" - } - }, - "TRIGGERMODEPACKAGE": { - "TRIGGERMODE": { - "TITLE": "触发模式", - "DESCRIPTION": "确定是否使用内存(默认)为without(on event)评估哨兵条件。默认值意味着满足的哨兵部分(on和ifparts)将被存储。当重新评估哨兵时,后续评估将使用存储的部分。使用“on event”,对所有部分进行评估,如果所有部分均为真,则哨兵满意。否则,所有结果都将被丢弃而不存储。" - } - }, - "AUTOCOMPLETEPACKAGE": { - "AUTOCOMPLETEENABLED": { - "TITLE": "自动完成", - "DESCRIPTION": "当所有必需的子级都处于结束状态且没有其他子级处于活动状态时,指示阶段将自动完成的标志。" - }, - "AUTOCOMPLETECONDITION": { - "TITLE": "自动完成条件", - "DESCRIPTION": "如果阶段可以自动完成,则解析为的表达式。" - } - }, - "REQUIREDRULEPACKAGE": { - "REQUIREDENABLED": { - "TITLE": "必须的", - "DESCRIPTION": "指示在确定父阶段完成时是否需要阶段、任务或里程碑的标志。默认为false。" - }, - "REQUIREDRULECONDITION": { - "TITLE": "必需规则", - "DESCRIPTION": "在确定父阶段完成时,决定阶段、任务或里程碑是否需要的表达式。" - } - }, - "REPETITIONRULEPACKAGE": { - "REPETITIONENABLED": { - "TITLE": "重复", - "DESCRIPTION": "指示是否启用重复的标志" - }, - "REPETITIONRULECONDITION": { - "TITLE": "重复规则", - "DESCRIPTION": "用于确定是否需要创建计划的新实例的表达式。" - }, - "REPETITIONCOUNTERVARIABLENAME": { - "TITLE": "重复计数器变量", - "DESCRIPTION": "存储重复实例计数器的局部变量的名称。默认值为“repetitionCounter”。" - } - }, - "MANUALACTIVATIONRULEPACKAGE": { - "MANUALACTIVATIONENABLED": { - "TITLE": "手动激活", - "DESCRIPTION": "指示任务或阶段是否需要手动激活的标志。默认为false。" - }, - "MANUALACTIVATIONRULECONDITION": { - "TITLE": "手动激活规则", - "DESCRIPTION": "一种表达式,用于确定阶段或任务是否需要手动激活。" - } - }, - "COMPLETIONNEUTRALRULEPACKAGE": { - "COMPLETIONNEUTRALENABLED": { - "TITLE": "完成中性", - "DESCRIPTION": "指示计划项是否处于非完成状态的标志。默认为false。" - }, - "COMPLETIONNEUTRALRULECONDITION": { - "TITLE": "完成中性规则", - "DESCRIPTION": "用于确定计划项是否为非完成状态的表达式。" - } - }, - "PLANITEMLIFECYCLELISTENERSPACKAGE": { - "PLANITEMLIFECYCLELISTENERS": { - "TITLE": "生命周期监听器", - "DESCRIPTION": "计划项生命周期事件的监听器" - } - }, - "DISPLAYORDERPACKAGE": { - "DISPLAYORDER": { - "TITLE": "显示顺序", - "DESCRIPTION": "表示获取或显示阶段概述时与其他阶段相比的顺序的数值。" - } - }, - "INCLUDEINSTAGEOVERVIEWPACKAGE": { - "INCLUDEINSTAGEOVERVIEW": { - "TITLE": "包括在概述中", - "DESCRIPTION": "指示是否应为阶段概述考虑此阶段" - } - }, - "MILESTONEVARIABLEPACKAGE" : { - "MILESTONEVARIABLE": { - "TITLE": "Milestone variable", - "DESCRIPTION": "If set, a variable with this name and boolean value true will be created when this milestone is reached" - } - }, - "SCRIPTFORMATPACKAGE": { - "SCRIPTFORMAT": { - "TITLE": "脚本格式", - "DESCRIPTION": "脚本任务的脚本格式(javascript、groovy等)。" - } - }, - "SCRIPTTEXTPACKAGE": { - "SCRIPTTEXT": { - "TITLE": "脚本", - "DESCRIPTION": "脚本任务的脚本文本。" - } - }, - "TRANSITIONEVENTPACKAGE": { - "TRANSITIONEVENT": { - "TITLE": "过渡事件类型", - "DESCRIPTION": "过渡事件类型" - } - }, - "AVAILABLECONDITIONPACKAGE": { - "AVAILABLECONDITION": { - "TITLE": "可用条件", - "DESCRIPTION": "事件监听器上的可选条件表达式,用于指示何时可用。" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "使結果變量瞬變", - "DESCRIPTION" : "指示存储結果變量变量瞬态的标志" - } - } - }, - "STENCILS" : { - "GROUPS" : { - "DIAGRAM" : "图解", - "CONTAINERS" : "容器", - "ACTIVITIES" : "活动", - "EVENTLISTENERS" : "事件监听器", - "SENTRIES" : "哨兵", - "CONNECTORS" : "连接器" - }, - "CMMNDIAGRAM" : { - "TITLE" : "CMMN-图", - "DESCRIPTION" : "CMMN 2.0 图表。" - }, - "CASEPLANMODEL" : { - "TITLE" : "案例计划模型", - "DESCRIPTION" : "案例计划模型" - }, - "STAGE" : { - "TITLE" : "阶段", - "DESCRIPTION" : "阶段" - }, - "TASK" : { - "TITLE" : "任务", - "DESCRIPTION" : "手动任务" - }, - "HUMANTASK" : { - "TITLE" : "人工任务", - "DESCRIPTION" : "分配给特定人员的手动任务" - }, - "SERVICETASK" : { - "TITLE" : "服务任务", - "DESCRIPTION" : "具有服务逻辑的自动任务" - }, - "DECISIONTASK" : { - "TITLE" : "决策任务", - "DESCRIPTION" : "调用DMN决策的任务" - }, - "HTTPTASK" : { - "TITLE" : "HTTP任务", - "DESCRIPTION" : "一个HTTP任务" - }, - "SCRIPTTASK" : { - "TITLE" : "脚本任务", - "DESCRIPTION" : "具有脚本逻辑的自动任务" - }, - "MILESTONE" : { - "TITLE" : "里程碑", - "DESCRIPTION" : "里程碑" - }, - "CASETASK" : { - "TITLE" : "案例任务", - "DESCRIPTION" : "引用案例定义以启动新实例" - }, - "PROCESSTASK" : { - "TITLE" : "流程任务", - "DESCRIPTION" : "对流程定义的引用以启动新实例" - }, - "EVENTLISTENER" : { - "TITLE" : "事件监听器", - "DESCRIPTION" : "通用事件监听器" - }, - "TIMEREVENTLISTENER" : { - "TITLE" : "计时器事件监听器", - "DESCRIPTION" : "带有计时器触发器的事件监听器" - }, - "USEREVENTLISTENER" : { - "TITLE" : "用户事件监听器", - "DESCRIPTION" : "用户事件的监听器" - }, - "ENTRYCRITERION" : { - "TITLE" : "进入准则", - "DESCRIPTION" : "定义进入标准的哨兵" - }, - "EXITCRITERION" : { - "TITLE" : "退出准则", - "DESCRIPTION" : "定义出口标准的哨兵" - }, - "ASSOCIATION" : { - "TITLE" : "关联", - "DESCRIPTION" : "将哨兵与计划项目联系起来" - } - } - }, - - "EDITOR": { - "POPUP": { - "UNSAVED-CHANGES": { - "TITLE": "您有未保存的更改", - "DESCRIPTION": "您想如何处理未保存的更改?", - "ACTION": { - "SAVE": "保存更改", - "DISCARD": "放弃更改", - "CONTINUE": "继续编辑" - } - } - } - }, - - "PROCESS-LIST" : { - "TITLE" : "业务流程模型", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建流程", - "IMPORT": "导入流程" - }, - - "FILTER" : { - "PROCESSES": "流程模型", - "PROCESSES-COUNT": "一共有 {{total}}个流程模型", - "PROCESSES-ONE": "有一个流程模型", - "PROCESSES-EMPTY": "目前还没有创建流程模型。您可以设计流程模型、用户表单,然后将它们捆绑到app中。第一步是创建流程模型:", - "PROCESSES-BPMN-HINT": "使用BPMN可视化编辑器创建BPMN模型.", - "PROCESSES-BPMN-IMPORT-HINT": "还可以导入现有的BPMN模型。", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到流程模型 \"{{filterText}}\"", - "RECENT": "最近", - "RECENT-COUNT": "{{total}} 最近使用的模型", - "RECENT-ONE": "最近使用的模型", - "RECENT-EMPTY": "最近没有使用模型" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "CASE-LIST" : { - "TITLE" : "案例模型", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建案例", - "IMPORT": "导入案例" - }, - - "FILTER" : { - "CASES": "案例模型", - "CASES-COUNT": "一共有 {{total}}个案例模型", - "CASES-ONE": "有一个case模型", - "CASES-EMPTY": "目前还没有创建案例模型。您可以设计实例模型、用户表单,然后将它们捆绑到app应用程序定义中。第一步是创建一个案例模型。:", - "CASES-CMMN-HINT": "使用CMMN可视化编辑器创建CMMN模型.", - "CASES-CMMN-IMPORT-HINT": "还可以导入现有CMMN模型。", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到case模型 \"{{filterText}}\"", - "RECENT": "最近", - "RECENT-COUNT": "{{total}} 最近使用的模型", - "RECENT-ONE": "最近使用的模型", - "RECENT-EMPTY": "最近没有使用模型" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "FORMS-LIST" : { - "TITLE" : "表单", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建表单", - "CREATE-INLINE": "现在创建一个新表单!", - "SHOW-MORE": "显示更多..." - }, - - "FILTER" : { - "FORMS": "表单", - "FORMS-COUNT": "一共有{{total}} 个表单", - "FORMS-ONE": "有一个表单", - "FORMS-EMPTY": "没有表单。若要添加一个,请单击创建表单 ", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到表单 \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "DECISIONS-LIST": { - "TITLE": "决策表", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION": { - "CREATE": "创建决策表", - "IMPORT": "导入决策表", - "CREATE-INLINE": "现在创建一个新的决策表!", - "SHOW-MORE": "显示更多..." - }, - - "FILTER": { - "DECISION-TABLES": "决策表", - "DECISION-TABLES-COUNT": "一共有 {{total}} 个决策表", - "DECISION-TABLES-ONE": "有一个决策表", - "DECISION-TABLES-EMPTY": "没有决策表。若要添加一个,请单击创建决策表 ", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到决策表 \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "APPS-LIST" : { - "TITLE" : "应用程序定义", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建应用程序", - "IMPORT": "导入应用程序", - "SHOW-MORE": "显示更多..." - }, - - "FILTER" : { - "APPS": "应用程序定义", - "APPS-COUNT": "一共有 {{total}}个应用程序定义", - "APPS-ONE": "有一个app定义", - "APPS-EMPTY": "没有应用程序定义。若要添加一个,请单击创建应用程序定义", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到应用程序定义 \"{{filterText}}\"", - - "NO-APPS": " 您可以通过发布一批流程模型来创建应用程序定义", - "NO-APPS-CALL-TO-ACTION": "现在可以创建一个应用程序定义 ", - "NO-APPS-NOTE": "当你准备好使用它时,记得要发布它。" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - "PROCESS": { - "NAME": "模型名称", - "KEY": "模型key", - "DESCRIPTION": "描述", - "VERSION-COMMENT": "版本注释", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "DUPLICATE": "复制这个模型", - "EXPORT_BPMN20": "导出到BPMN2", - "DELETE": "删除这个模型", - "CREATE-CONFIRM": "创建新模型", - "DUPLICATE-CONFIRM": "复制这个模型", - "OPEN-IN-EDITOR": "可视化编辑器", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "删除流程模型", - "USE-AS-NEW-VERSION": "作为新版本使用", - "FAVORITE": "喜欢这个模型" - - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建", - "NO-DESCRIPTION": "这个模型没有描述信息,可以通过修改模型来添加一个描述" - }, - - "POPUP": { - "CREATE-TITLE": "创建一个新的业务流程模型", - "DUPLICATE-TITLE": "复制这个业务流程模型", - "CREATE-DESCRIPTION": "您需要为新模型命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您可以更改新模型的名称,并且此时您可以更改描述信息。", - "EDIT-DESCRIPTION": "更改下面的任何模型属性,然后按下保存去更新模型。", - "DELETE-DESCRIPTION": "确实要删除进程模型吗? \"{{name}}\"?", - "EDIT-TITLE":"编辑模型详细信息", - "DELETE-TITLE": "删除模型", - "DELETE-LOADING-RELATIONS": "检查模型使用...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-RELATIONS-DESCRIPTION": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-PROCESS-RELATION": "流程模型", - "DELETE-FORM-RELATION": "表单模型", - "DELETE-APP-RELATION": "App模型", - "IMPORT-DESCRIPTION": "请浏览或拖拽.bpmn或.bpmn20.xml扩展名的BPMN XML定义", - "IMPORT-TITLE": "导入一个流程模型", - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新app模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建", - "SHARED-WITH": "分享", - "PERMISSION": "许可", - "ACTIONS": "动作", - "IMPORT": { - "DROPZONE": "拖拽一个 .bpmn 或者 .bpmn20.xml BPMN XML 文件", - "CANCEL-UPLOAD": "取消上传", - "ERROR": "处理BPMN XML文件时出错", - "NO-DROP": "不支持拖放" - } - }, - "ALERT": { - "EDIT-CONFIRM": "模型被更新" - }, - "ERROR": { - "NOT-FOUND": "所请求的模型不存在" - } - }, - - "SUBPROCESS": { - "NAME": "子流程名称", - "DESCRIPTION": "描述信息", - "ACTION": { - "CREATE-CONFIRM": "创建一个子流程" - }, - "POPUP": { - "CREATE-TITLE": "创建一个新的子流程", - "CREATE-DESCRIPTION": "您需要为新的子流程命名,并且您可能希望同时添加描述。" - } - }, - - "CASE": { - "NAME": "模型名称", - "KEY": "模型key", - "DESCRIPTION": "描述信息", - "VERSION-COMMENT": "版本注释", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "DUPLICATE": "复制这个模型", - "EXPORT_CMMN": "导出到CMMN1.1", - "DELETE": "删除这个模型", - "CREATE-CONFIRM": "创建新模型", - "DUPLICATE-CONFIRM": "复制这个模型", - "OPEN-IN-EDITOR": "可视化编辑器", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "删除case模型", - "USE-AS-NEW-VERSION": "作为新版本使用", - "FAVORITE": "喜欢这个模型" - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "LAST-UPDATED-BY": "最后被 {{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建", - "NO-DESCRIPTION": "这个模型没有描述信息,可以通过修改模型来添加一个描述" - }, - - "POPUP": { - "CREATE-TITLE": "创建一个新的案例模型", - "DUPLICATE-TITLE": "复制这个案例模型", - "CREATE-DESCRIPTION": "您需要为新模型命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您可以更改新模型的名称,并且此时您可以更改描述信息。", - "EDIT-DESCRIPTION": "更改下面的任何模型属性,然后按下保存去更新模型。", - "DELETE-DESCRIPTION": "确实要删除进程流程吗 \"{{name}}\"?", - "EDIT-TITLE":"编辑模型详细信", - "DELETE-TITLE": "删除模型", - "DELETE-LOADING-RELATIONS": "检查模型使用...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-RELATIONS-DESCRIPTION": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-PROCESS-RELATION": "案例模型", - "DELETE-FORM-RELATION": "表单模型", - "DELETE-APP-RELATION": "应用程序模型", - "IMPORT-DESCRIPTION": "请浏览或拖拽.cmmn 或者.cmmn.xml 扩展名的CMMN XML", - "IMPORT-TITLE": "导入一个案例模型", - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新应用程序模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建", - "SHARED-WITH": "分享", - "PERMISSION": "许可", - "ACTIONS": "动作", - "IMPORT": { - "DROPZONE": "拖拽一个 .cmmn or .cmmn.xml CMMN XML文件", - "CANCEL-UPLOAD": "取消上传", - "ERROR": "处理CMMN XML文件时出错", - "NO-DROP": "不支持拖放" - } - }, - "ALERT": { - "EDIT-CONFIRM": "模型被更新" - }, - "ERROR": { - "NOT-FOUND": "所请求的模型不存在" - } - }, - - "FORM": { - "NAME": "表单名称", - "KEY": "表单key", - "DESCRIPTION": "描述", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "DELETE": "复制这个表单", - "CREATE-CONFIRM": "创建新表单", - "DUPLICATE": "复制这个表单", - "DUPLICATE-CONFIRM": "复制这个表单", - "OPEN-IN-EDITOR": "表单编辑器", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "删除表单", - "USE-AS-NEW-VERSION": "作为新版本使用" - - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建" - }, - - "POPUP": { - "CREATE-TITLE": "创建一个新的表单", - "DUPLICATE-TITLE": "复制这个表单", - "CREATE-DESCRIPTION": "您需要为新表单命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您需要为新表单命名,并且您可以在这个操作中添加描述信息。", - "SAVE-FORM-TITLE": "保存表单", - "EDIT-DESCRIPTION": "更改下面的任何模型属性,然后按下保存去更新表单。", - "DELETE-DESCRIPTION": "确实要删除表单 \"{{name}}\"?", - "EDIT-TITLE":"编辑表单详细信息", - "DELETE-TITLE": "删除表单", - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-VERSION": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新app模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建" - } - }, - - "DECISION-TABLE": { - "NAME": "决策表 名称", - "KEY": "决策表 key", - "DESCRIPTION": "描述", - "VERSION-COMMENT": "版本注释", - "HIT-POLICY": "命中策略:", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "SHARE": "分享决策表", - "DELETE": "删除决策表", - "ADD-COMMENT": "+ 添加评论", - "CREATE-CONFIRM": "创建新的决策表", - "OPEN-IN-EDITOR": "决策表编辑器", - "EXPORT": "Export 决策表", - "DELETE-CONFIRM": "删除决策表", - "USE-AS-NEW-VERSION": "作为新版本使用", - "FAVORITE": "喜欢这个决策表", - "DUPLICATE": "复制这个决策表" - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "COMMENTS-TITLE": "评论", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建" - }, - "HIT-POLICIES": { - "FIRST": "第一个", - "ANY": "任何", - "UNIQUE": "唯一", - "PRIORITY": "优先级", - "RULE ORDER": "规则顺序", - "OUTPUT ORDER": "输出顺序", - "COLLECT": "采集" - }, - "COLLECT-OPERATORS": { - "SUM": "和", - "MIN": "最小", - "MAX": "最大", - "COUNT": "总数" - }, - "POPUP": { - "CREATE-TITLE": "创建一个新的决策表", - "CREATE-DESCRIPTION": "您需要为新决策表命名,并且您可以在这个操作中添加描述信息。", - "SAVE-DESCRIPTION": "您可以更改新决策表的名称,并且此时您可以更改描述信息。", - "DUPLICATE-TITLE": "复制决策表", - "DUPLICATE-DESCRIPTION": "您需要为新决策表命名,并且您可以在这个操作中添加描述信息。", - "DELETE-TITLE": "删除决策表", - "DELETE-DESCRIPTION": "确实要删除决策表 \"{{name}}\"?", - "SAVE-DECISION-TABLE-TITLE": "保存决策表", - "IMPORT-DESCRIPTION": "请浏览或拖拽.dmn or .dmn.xml扩展名的的 DMN XML文件", - "IMPORT-TITLE": "导入DMN模型", - "IMPORT": { - "DROPZONE": "拖拽一个 .dmn or .dmn.xml DMN XML文件", - "CANCEL-UPLOAD": "取消上传", - "ERROR": "处理DMN XML文件时出错", - "NO-DROP": "不支持拖放" - }, - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-VERSION": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新app模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建" - }, - "ALERT": { - "FAVORITE-CONFIRM": "喜欢这个决策表", - "UN-FAVORITE-CONFIRM": "这个决策表不再流行了" - } - }, - - "APP": { - "NAME": "应用程序定义名称", - "KEY": "应用程序定义key", - "DESCRIPTION": "描述", - "ICON": "图标", - "THEME": "主题", - "GROUPS-ACCESS": "组访问,用逗号分隔", - "USERS-ACCESS": "用户访问,用逗号分隔", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改应用程序定义属性", - "DUPLICATE": "复制这个应用", - "SHARE": "分享应用程序定义", - "DELETE": "删除应用程序定义", - "CREATE-CONFIRM": "创建新的应用程序定义", - "DUPLICATE-CONFIRM": "复制这个应用程序定义", - "DELETE-CONFIRM": "删除应用程序定义", - "USE-AS-NEW-VERSION": "作为新版本使用", - "OPEN-IN-EDITOR": "应用程序编辑器", - "PUBLISH": "发布", - "PUBLISH-CONFIRM": "发布应用程序定义", - "SELECT-ICON": "修改图标...", - "SELECT-THEME": "修改主题...", - "EDIT-MODELS": "编辑包含的模型", - "EXPORT-ZIP": "将app定义导出为zip文件", - "EXPORT-BAR": "将app定义导出为可部署的bar文件" - - }, - "DETAILS": { - "TITLE": "App定义详细信息: {{name}}", - "HISTORY-TITLE": "历史", - "MODELS-TITLE": "app定义中包含的模型", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建", - "NO-DESCRIPTION": "这个应用程序定义没有描述信息,可以通过修改应用程序定义来添加一个描述", - "NO-MODELS-SELECTED": "没有为这个应用程序选择模型" - }, - "TITLE": { - "SELECT-ICON": "选择应用图标", - "SELECT-THEME": "选择应用主题", - "PREVIEW": "预览" - - }, - "POPUP": { - "CREATE-TITLE": "创建新的应用程序定义", - "DUPLICATE-TITLE": "复制一个应用程序定义", - "SAVE-APP-TITLE": "保存应用程序定义", - "SAVE-APP-SAVE-SUCCESS": "保存的应用程序定义", - "CREATE-DESCRIPTION": "您需要为新的应用程序定义命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您需要为新的应用程序定义命名,并且您可以在这个操作中添加描述信息。", - "PUBLISH-TITLE": "发布应用程序定义", - "PUBLISH-DESCRIPTION": "您确定要发布应用程序定义 \"{{name}}\"? 注意这个应用程序定义将版本化,如果已经存在,则将更新工作流应用程序。", - "PUBLISH-FIELD": "发布?请注意,如果启用了发布,则将版本化此应用程序定义,如果已经存在,则将更新工作流应用程序。", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT": "你的流程模型 \"{{modelInAppName}}\"具有相同的标识符\"{{processDefinitionKey}}\"作为已经存在的部署流程\"{{conflictingModelName}}\" ,关于这个应用程序 \"{{conflictingAppName}}\". 请修改这个 \"id\"流程模型的属性。", - "PUBLISH-ERROR-PROCESS-ALREADY-USED": "下面的流程模型已经在另一个应用程序中使用了。这样行吗?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP": "应用程序", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS": "无效的应用程序: 找到重复的流程标识符 (修改这个非法的流程模型 \"id\"属性):", - "DELETE-TITLE": "删除应用程序定义", - "DELETE-DESCRIPTION": "确实要删除应用程序定义 \"{{name}}\"?", - "DELETE-DESCRIPTION-WITH-RUNTIME": "确实要删应用程序定义 \"{{name}}\"? 注意,这个应用程序定义已经部署到任务landing页面,并且通过确认,该应用程序将从任务应用程序landing页面中删除。", - "DELETE-CASCADE-FALSE": "只删除当前版本的应用程序定义 (v{{version}})", - "DELETE-CASCADE-TRUE": "也删除所有以前的版本应用程序定义", - "HAS-CUSTOM-STENCILITEM" : "模型 \"{{modelName}}\" 使用带有自定义模板项目的模板. 在这个模型中使用这个模型是不可能的.", - "HAS-VALIDATIONERROR" : "模型 \"{{modelName}}\" 有验证错误,不能添加到应用程序定义.在编辑器中打开模型以查看关于验证错误的更多细节。", - "IMPORT-DESCRIPTION":"请使用.zip扩展的应用程序定义浏览或拖拽一个", - "IMPORT-TITLE":"导入应用程序定义模型", - "IMPORT": { - "DROPZONE": "扩拽一个.zip 应用程序定义文件", - "CANCEL-UPLOAD": "取消上传", - "RENEWIDM-IDS": "Renew the user and group identifiers when importing step and BPMN models. This is often required when importing the 应用程序定义 into a different Flowable environment. It will try to link the human steps and user tasks to the right user and group in this target environment.", - "ERROR": "处理应用程序定义文件时出错", - "NO-DROP": "不支持拖放" - }, - "INCLUDE-MODELS-TITLE": "包含在应用程序定义中的模型" - }, - "ALERT": { - "DELETE-CONFIRM": "应用程序定义删除了", - "PUBLISH-CONFIRM": "应用程序定义已经被发布了", - "PUBLISH-ERROR": "不能发布应用程序定义. 请检查引用的流程模型的有效性。" - } - }, - - "SHARE-INFO": { - "ACTION": { - "ADD": "添加另一个人" - } - }, - - "FORM-BUILDER": { - "PALLETTE": { - "TEXT": "文本", - "MULTILINE-TEXT": "多行文本", - "PASSWORD": "密码", - "NUMBER": "数字", - "CHECKBOX": "多选", - "DATE": "日期", - "DROPDOWN": "下拉", - "RADIO": "单选按钮", - "PEOPLE": "选择人", - "GROUP-OF-PEOPLE": "选择组", - "UPLOAD": "上传文件", - "EXPRESSION": "表达式", - "DECIMAL": "小数", - "HYPERLINK": "超链接", - "SPACER": "垫片", - "HORIZONTAL-LINE": "横线", - "HEADLINE": "标题", - "HEADLINE-WITH-LINE":"标题和线" - }, - "TABS": { - "GENERAL": "一般", - "OPTIONS": "选项", - "UPLOAD-OPTIONS": "上传选项", - "ADVANCED-OPTIONS":"高级" - }, - "VERSION": "版本 {{version}}", - "LAST-UPDATED": "最后更新的 {{lastUpdatedBy}}, {{lastUpdated | dateformat}}", - "TITLE": { - "DESIGN": "设计", - "OUTCOME": "结果" - }, - "POPUP": { - "EDIT-TITLE": "编辑字段 '{{name}}'", - "EXPRESSION-TITLE": "编辑表达式" - }, - "MESSAGE": { - "EMPTY-EXPRESSION": "(没有表达值)", - "EXPRESSION-HELP": "您还可以使用如下的符号来引用先前以任何形式提交的值,作为文本的一部分 ${myFieldId}.", - "OPTIONS-EXPRESSION-HELP": "可以使用表达式来动态填充选项,例如通过引用这样的变量 ${optionsVariable}. 这个表达式需要产生一个java对象(java.util)。带有选项对象的列表)或其json表示。" - }, - "LABEL" : { - "FUNCTIONAL-GROUP": "选择组..", - "PERSON": "选择人.." - }, - "COMPONENT": { - "LABEL": "标签:", - "OVERRIDEID": "覆盖id?", - "ID": "Id:", - "PLACEHOLDER": "默认值:", - "OPTIONS": "选项", - "RADIO-BUTTON-DEFAULT": "选项 1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION": "请选择一个...", - "DROPDOWN-EMPTY-VALUE-HELP": " 这是‘空值’选项。在运行时选择它意味着‘没有值’或’空’。这允许用于可选字段,但不允许用于必需字段。", - "OPTIONS-EXPRESSION": "选择表达:", - "OPTIONS-EXPRESSION-ENABLED": "启用选项表达", - "REQUIRED": "必填", - "READONLY": "只读", - "EXPRESSION": "表达式", - "ADD-OPTION": "+ 添加一个新选项", - "UPLOAD-ALLOW-MULTIPLE": "允许上传多个文件", - "SIZE": "大小", - "MAX-LENGTH":"最大长度:", - "MIN-LENGTH":"最小长度:", - "PASSWORD-UNMASK-OPTION": "密码屏蔽/揭露选项", - "HYPERLINK-URL": "超链接地址", - "REGEX-PATTERN":"正则表达式的标准", - "MASK":{ - "TITLE":"输入掩码", - "EXAMPLES":{ - "TITLE":"例子:", - "NUMBER":"任何数字", - "LETTER":"任何字母", - "NUMBERORLETTER":"任何字母或数字", - "OPTIONAL":"使蒙版可选(无效)", - "PHONE":"电话" - } - } - }, - "OUTCOMES": { - "DESCRIPTION": "您可以为这个任务定义多个结果。在完成一个任务时,用户选择一个可用的结果,可在后续的流程中使用结果变量", - "NO-OUTCOMES-OPTION": "不要使用自定义结果,只显示'完成'按钮。", - "OUTCOMES-OPTION": "使用此表单的定制结果。", - "POSSIBLE-OUTCOMES": "可能的结果", - "NEW-OUTCOME-PLACEHOLDER": "输入新的结果", - "ADD": "添加结果", - "REMOVE": "移除" - } - }, - - "DECISION-TABLE-EDITOR": { - "EMPTY-MESSAGES": { - "NO-VARIABLE-SELECTED": "未定义" - }, - "POPUP": { - "EXPRESSION-EDITOR": { - "INPUT-TITLE": "编辑输入列", - "INPUT-DESCRIPTION": "选择输入变量作为列的输入", - "OUTPUT-TITLE": "编辑输出列", - "OUTPUT-DESCRIPTION": "选择一个现有的输出变量或创建一个新的变量", - "EXPRESSION-LABEL": "列标签:", - "EXPRESSION-PLACEHOLDER": "输入可选标签", - "EXPRESSION-VARIABLE-NAME": "变量名称:", - "EXPRESSION-VARIABLE-TYPE": "变量类型:", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER": "输入变量名", - "OUTPUT-NEW-VARIABLE-ID": "变量ID:", - "OUTPUT-NEW-VARIABLE-TYPE": "变量类型:", - "COMPLEX-EXPRESSION-LABEL": "复杂表达式:", - "ALLOWED-VALUES": "允许值(可选):", - "OUTPUT-VALUES": "输出值", - "OUTPUT-VALUES-OPTIONAL": "(可选):", - "OUTPUT-VALUES-NOT-OPTIONAL": "(为优先级/输出顺序拖动行):" - } - }, - "BUTTON-ACTIONS-LABEL": "动作", - "BUTTON-ADD-INPUT-LABEL": "添加输入", - "BUTTON-ADD-OUTPUT-LABEL": "添加输出", - "BUTTON-ADD-RULE-LABEL": "添加规则", - "BUTTON-MOVE-RULE-UPWARDS-LABEL": "向上移动", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL": "向下移动", - "BUTTON-REMOVE-RULE-LABEL": "移除规则", - "ALERT": { - "EXPRESSION-VARIABLE-REQUIRED-ERROR": "所有输入和输出表达式都必须引用表单字段或变量。", - "SAVE-CONFIRM": "保存决策表'{{name}}'" - } - }, - - "TOUR": { - "WELCOME-TITLE": "欢迎, {{userName}}", - "WELCOME-CONTENT": "这是一个短暂的flowable编辑器. 接下来的几个步骤将指导您通过应用程序的不同部分来启动。按ESC键随时停止。" , - "PALETTE-TITLE": "调色板", - "PALETTE-CONTENT": "在这里可以找到创建业务流程的所有可用构成。它们是按逻辑组排列的。只需点击它就可以打开一组:", - "CANVAS-TITLE": "画布", - "CANVAS-CONTENT": "这是创建业务流程的工作空间。从左侧的调色板中拖动元素,并将它们放在画布上以开始建模", - "DRAGDROP-TITLE": "拖放示例", - "DRAGDROP-CONTENT": "下面是一个如何开始建模的例子:", - "PROPERTIES-TITLE": "属性", - "PROPERTIES-CONTENT": "在这里您可以配置业务流程构造的属性。只需选择画布上的项目,它的属性就会显示出来。如果要编辑该属性,请单击该属性。", - "TOOLBAR-TITLE": "工具栏", - "TOOLBAR-CONTENT": "可以在这里找到所有的动作:保存或验证模型, 复制和粘贴一个流程的部分, 等等. 在按钮上悬停以此获得对动作的描述信息.", - "END-TITLE": "终点", - "END-CONTENT": "就是这样!现在可以开始建模过程。如果你有任何问题,可以问他们。 Flowable论坛 " - }, - - "FEATURE-TOUR" : { - "BENDPOINT" : { - "TITLE": "教程", - "DESCRIPTION" : "当使用连线流将流程按照步骤彼此连接的时候,您可能会发现,这些连线彼此交叉,或者您希望以不同的方式排列它们。这样做, 可以向连线添加或移除一个弯曲点。

如下图所示,你首先应该点击 '添加弯曲点' 然后单击连线添加它。注意,连线将在绿色中显示一个微妙的指示,以显示可以在那里添加弯曲点。

删除一个弯曲点再次遵循类似的模式: 点击 '移除弯曲点' 按钮 ,然后点击弯曲点再次移除。" - } - }, - - "ACTION.OK" : "Ok", - "ACTION.SAVE" : "保存", - "ACTION.SAVE-AND-CLOSE" : "保存和关闭编辑器", - "ACTION.SEND" : "发送", - "ACTION.CANCEL" : "取消", - "ACTION.SELECT" : "选择", - "ACTION.ADD" : "添加", - "ACTION.REMOVE" : "移除", - "ACTION.MOVE.UP" : "移动入口", - "ACTION.MOVE.DOWN" : "向下移动", - - "TOOLBAR.ACTION.CLOSE" : "关闭编辑器并返回到概览页面", - "TOOLBAR.ACTION.SAVE" : "保存模型", - "TOOLBAR.ACTION.VALIDATE" : "验证模型", - "TOOLBAR.ACTION.CUT" : "剪切 (在业务流程中选择一个或多个元素)", - "TOOLBAR.ACTION.COPY" : "拷贝 (在业务流程中选择一个或多个元素)", - "TOOLBAR.ACTION.PASTE" : "粘贴", - "TOOLBAR.ACTION.DELETE" : "删除选定元素", - "TOOLBAR.ACTION.UNDO" : "撤消", - "TOOLBAR.ACTION.REDO" : "重做", - "TOOLBAR.ACTION.ZOOMIN" : "放大", - "TOOLBAR.ACTION.ZOOMOUT" : "缩小", - "TOOLBAR.ACTION.ZOOMACTUAL" : "缩放到实际尺寸", - "TOOLBAR.ACTION.ZOOMFIT" : "缩放到适当大小", - "TOOLBAR.ACTION.BENDPOINT.ADD" : "向选定的连线添加弯曲点", - "TOOLBAR.ACTION.BENDPOINT.REMOVE" : "向选定的连线移除弯曲点", - "TOOLBAR.ACTION.ALIGNHORIZONTAL" : "水平对齐", - "TOOLBAR.ACTION.ALIGNVERTICAL" : "垂直对齐", - "TOOLBAR.ACTION.SAMESIZE" : "相同大小", - "TOOLBAR.ACTION.HELP": "开始导游", - "TOOLBAR.ACTION.FEEDBACK": "提供反馈", - - "FORM_TOOLBAR.ACTION.SAVE" : "保存模型", - - "APP_DEFINITION_TOOLBAR.ACTION.SAVE" : "保存应用程序定义", - - "BUTTON.ACTION.DELETE.TOOLTIP": "从模型中删除元素", - "BUTTON.ACTION.MORPH.TOOLTIP": "更改元素类型", - - "ELEMENT.AUTHOR" : "作者", - "ELEMENT.DATE_CREATED" : "创建日期", - - "PROPERTY.REMOVED" : "移除", - "PROPERTY.EMPTY" : "空值", - "PROPERTY.PROPERTY.EDIT.TITLE" : "更改值为", - - "PROPERTY.FEEDBACK.TITLE" : "请填写您的反馈意见", - - "PROPERTY.ASSIGNMENT.TITLE" : "分配", - "PROPERTY.ASSIGNMENT.TYPE" : "类型", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE" : "身份存储", - "PROPERTY.ASSIGNMENT.TYPE.STATIC" : "固定值", - "PROPERTY.ASSIGNMENT.ASSIGNEE" : "分配", - "PROPERTY.ASSIGNMENT.MATCHING" : "使用 ↑ 和 ↓选择并按Enter确认或使用鼠标", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER" : "输入分配人", - "PROPERTY.ASSIGNMENT.EMPTY" : "没有选择分配人", - "PROPERTY.ASSIGNMENT.NONE" : "未分配经办人", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "搜索用户", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "搜索组", - "PROPERTY.ASSIGNMENT.SEARCH": "搜索: ", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY" : "分配人 {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY" : "{{length}} 候选用户", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS" : "候选用户", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY" : "{{length}} 候选组", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS" : "候选组", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY": "用户 {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY": "用户 {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY": "字段 {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY" : "流程发起人", - "PROPERTY.ASSIGNMENT.IDM.TYPE" : "分配", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS" : "没有选择候选人...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS" : "没有选择候选组...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR" : "分配给流程发起人", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER" : "分配给单个用户", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS" : "候选用户", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS" : "候选组", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE" : "允许流程发起人完成任务", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY" : "{{length}} 执行监听器", - "PROPERTY.EXECUTIONLISTENERS.EMPTY" : "没有配置执行监听器", - "PROPERTY.EXECUTIONLISTENERS.EVENT" : "事件", - "PROPERTY.EXECUTIONLISTENERS.CLASS" : "类", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION" : "表达式", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED" : "没有选择执行监听器", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME" : "名称", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE" : "字符串值", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符串值", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING" : "字符串", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER" : "输入一个字符串", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION" : "实现", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY" : "未选择字段", - - "PROPERTY.FIELDS" : "{{length}} 字段", - "PROPERTY.FIELDS.EMPTY" : "未选择字段", - "PROPERTY.FIELDS.NAME" : "名称", - "PROPERTY.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.FIELDS.STRINGVALUE" : "字符串值", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符串值", - "PROPERTY.FIELDS.STRING" : "字符串", - "PROPERTY.FIELDS.STRING.PLACEHOLDER" : "输入一个字符串", - "PROPERTY.FIELDS.IMPLEMENTATION" : "实现", - - "PROPERTY.DATAPROPERTIES.VALUES" : "{{length}} 数据对象", - "PROPERTY.DATAPROPERTIES.EMPTY" : "没有配置数据对象", - "PROPERTY.DATAPROPERTIES.ID" : "Id", - "PROPERTY.DATAPROPERTIES.ID.PLACEHOLDER" : "输入一个id", - "PROPERTY.DATAPROPERTIES.NAME" : "名称", - "PROPERTY.DATAPROPERTIES.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.DATAPROPERTIES.TYPE" : "类型", - "PROPERTY.DATAPROPERTIES.VALUE.PLACEHOLDER" : "输入一个值 (可选)", - "PROPERTY.DATAPROPERTIES.VALUE" : "默认值", - - "PROPERTY.FORMPROPERTIES.VALUE" : "{{length}} 表单属性", - "PROPERTY.FORMPROPERTIES.EMPTY" : "没有选择表单属性", - "PROPERTY.FORMPROPERTIES.ID" : "Id", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER" : "输入一个id", - "PROPERTY.FORMPROPERTIES.NAME" : "名称", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.FORMPROPERTIES.TYPE" : "类型", - "PROPERTY.FORMPROPERTIES.DATEPATTERN" : "日期格式", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER" : "输入日期格式", - "PROPERTY.FORMPROPERTIES.VALUES" : "值", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY" : "未选择枚举值", - "PROPERTY.FORMPROPERTIES.VALUES.ID" : "Id", - "PROPERTY.FORMPROPERTIES.VALUES.NAME" : "名称", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER" : "输入id值", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER" : "输入名称值", - "PROPERTY.FORMPROPERTIES.EXPRESSION" : "表达式", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.FORMPROPERTIES.VARIABLE" : "变量", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER" : "输入一个变量", - "PROPERTY.FORMPROPERTIES.DEFAULT" : "默认值", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER" : "输入一个默认值", - "PROPERTY.FORMPROPERTIES.REQUIRED" : "必须的", - "PROPERTY.FORMPROPERTIES.READABLE" : "可读的", - "PROPERTY.FORMPROPERTIES.WRITABLE" : "可写的", - - "PROPERTY.INPARAMETERS.VALUE" : "{{length}}个输入参数", - "PROPERTY.INPARAMETERS.EMPTY" : "没有配置输入参数", - - "PROPERTY.OUTPARAMETERS.VALUE" : "{{length}}个输出参数", - "PROPERTY.OUTPARAMETERS.EMPTY" : "没有配置输出参数", - - "PROPERTY.PARAMETER.SOURCE" : "源", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER" : "输入一个源", - "PROPERTY.PARAMETER.SOURCEEXPRESSION" : "源表达式", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER" : "输入一个源表达式", - "PROPERTY.PARAMETER.TARGET" : "目标", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER" : "输入一个目标", - "PROPERTY.PARAMETER.TARGETEXPRESSION" : "目标表达式", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER" : "输入一个目标表达式", - "PROPERTY.PARAMETER.EMPTY" : "没有选择参数", - - "PROPERTY.PROCESSREFERENCE.EMPTY" : "没有选择引用", - "PROPERTY.PROCESSREFERENCE.TITLE" : "流程参考", - "PROPERTY.PROCESSREFERENCE.ERROR.PROCESS" : "加载流程出错。稍后再试一次", - "PROPERTY.PROCESSREFERENCE.PROCESS.LOADING" : "加载流程...", - "PROPERTY.PROCESSREFERENCE.PROCESS.EMPTY" : "此文件夹不包含流程", - - "PROPERTY.FORMREFERENCE.EMPTY" : "没有选择参考", - "PROPERTY.FORMREFERENCE.TITLE" : "表单引用", - "PROPERTY.FORMREFERENCE.DESCRIPTION" : "引用表单", - "PROPERTY.FORMREFERENCE.ERROR.FORM" : "加载表单出错。稍后再试一次", - "PROPERTY.FORMREFERENCE.FORM.LOADING" : "加载表单...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY" : "此文件夹不包含表单", - - "PROPERTY.TASKLISTENERS.VALUE" : "{{length}}任务监听器", - "PROPERTY.TASKLISTENERS.EMPTY" : "没有配置任务监听器", - "PROPERTY.TASKLISTENERS.EVENT" : "事件", - "PROPERTY.TASKLISTENERS.CLASS" : "类", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.TASKLISTENERS.EXPRESSION" : "表达式", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.TASKLISTENERS.UNSELECTED" : "没有选择任务监听器", - "PROPERTY.TASKLISTENERS.FIELDS.NAME" : "名称", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE" : "字符串值", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符串值", - "PROPERTY.TASKLISTENERS.FIELDS.STRING" : "字符串", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER" : "输入一个字符串", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION" : "实现", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY" : "没有选择字段", - - "PROPERTY.EVENTLISTENERS.DISPLAY" : "{{length}} 事件监听器", - "PROPERTY.EVENTLISTENERS.EMPTY" : "没有配置事件监听器", - "PROPERTY.EVENTLISTENERS.EVENTS": "事件", - "PROPERTY.EVENTLISTENERS.RETHROW": "Rethrow event?", - "PROPERTY.EVENTLISTENERS.CLASS" : "类", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE" : "实体类型", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER" : "输入一个实体类型", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE": "Rethrow event type", - "PROPERTY.EVENTLISTENERS.ERRORCODE" : "错误码", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER" : "输入一个错误码", - "PROPERTY.EVENTLISTENERS.MESSAGENAME" : "消息名称", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER" : "输入一个消息名称", - "PROPERTY.EVENTLISTENERS.SIGNALNAME" : "信号名称", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER" : "输入信号名称", - "PROPERTY.EVENTLISTENERS.UNSELECTED" : "没有选择事件监听器", - - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE" : "{{length}}个生命周期侦听器", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY" : "未配置生命周期侦听器", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT" : "事件", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE" : "源状态", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE" : "目标状态", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS" : "类", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION" : "表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED" : "未选择任务监听器", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME" : "名称", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE" : "字符值", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符值", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING" : "字符", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER" : "输入一个字符值", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION" : "实现", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY" : "没有选中字段", - - "PROPERTY.SIGNALDEFINITIONS.DISPLAY" : "{{length}} 信号定义", - "PROPERTY.SIGNALDEFINITIONS.EMPTY" : "没有配置信号定义", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL": "全局", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE": "流程实例", - "PROPERTY.SIGNALDEFINITIONS.ID" : "Id", - "PROPERTY.SIGNALDEFINITIONS.NAME" : "名称", - "PROPERTY.SIGNALDEFINITIONS.SCOPE" : "Scope", - - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY" : "{{length}} 消息定义", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY" : "没有配置消息定义", - "PROPERTY.MESSAGEDEFINITIONS.ID" : "Id", - "PROPERTY.MESSAGEDEFINITIONS.NAME" : "名称", - - "PROPERTY.ESCALATIONDEFINITIONS.DISPLAY" : "{{length}} 个升级定义", - "PROPERTY.ESCALATIONDEFINITIONS.EMPTY" : "没有配置升级定义", - "PROPERTY.ESCALATIONDEFINITIONS.ID" : "Id", - "PROPERTY.ESCALATIONDEFINITIONS.NAME" : "名称", - - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY" : "没有确定连线的顺序", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY" : "设置连线的顺序", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND" : "没有发现流出连线.", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION" : "设置需要评估连线的顺序:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE" : "连线到 {{targetType}} {{targetTitle}}", - - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE" : "连线条件", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC" : "条件表达式", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY": "没有设置条件", - - "PROPERTY.DUEDATE.EMPTY" : "没有到期", - "PROPERTY.DUEDATE.DEFINED" : "定义到期日", - "PROPERTY.DUEDATE.TITLE" : "到期日", - "PROPERTY.DUEDATE.EXPRESSION-LABEL" : "到期日表达式", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE" : "没有到期日", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION" : "表达式定义", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC" : "任务创建后的固定持续时间", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD" : "基于字段", - - "MODEL.SAVE.TITLE" : "保存模型", - "MODEL.VALIDATE.TITLE" : "验证结果", - "MODEL.NAME" : "名称", - "MODEL.KEY" : "Key", - "MODEL.DESCRIPTION" : "描述", - "MODEL.SAVE.NEWVERSION" : "将此保存为新版本?这意味着你可以回到以前的版本。", - "MODEL.SAVE.COMMENT" : "评论", - "MODEL.SAVE.SAVING" : "正在保存模型", - "MODEL.LASTMODIFIEDDATE" : "最后保存", - "MODEL.SAVE.ERROR": "Unexpected error: 不能保存模型", - "MODEL.VALIDATIONERRORS": " 注意,模型包含验证错误。这意味着该模型在当前状态下不能部署在Flowable引擎上。", - "MODEL.CONFLICT.WRITE": "不能保存模型: '{{userFullName}}'对该模型进行了更改", - "MODEL.CONFLICT.WRITE.OPTIONS": "选择一个选项来解决此冲突:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE": "覆盖其他模型", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES": "放弃我的改变", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS": "保存为新模型", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION": "创建新版本", - "MODEL.CONFLICT.SAVEAS" : "另存为:", - - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP": "一项活动将作为对另一活动的补偿而被执行。事件针对即将执行的活动进行补偿。", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP": "一项活动已圆满完成。", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP": "活动已接收到错误事件。在活动接收到实际错误之前发送", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP": "创建了新的membership", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP": "单个membership已被删除", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP": "相关组中的所有成员已被删除。由于可能的原因,个别事件不会被派遣。", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP": "一个任务已经被分配人了。这将抛出一个实体更新事件", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP": "一个任务已经被完成。在删除任务实体之前调度", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP": "当BPMN错误被抛出,但未在流程中捕获时", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP": "已经创建了一个新的变量", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP": "已删除现有变量", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP": "已更新现有变量", - - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY" : "没有选择引用", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE" : "决策表引用", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM" : "加载决策表出现错误. 稍后再试一次", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING" : "加载决策表...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY" : "此文件夹不包含任何决策表", - - "PROPERTY.CASEREFERENCE.EMPTY" : "没有选择引用", - "PROPERTY.CASEREFERENCE.TITLE" : "案例型引用", - "PROPERTY.CASEREFERENCE.ERROR.FORM" : "加载案例模型时出错。稍后再试一次", - "PROPERTY.CASEREFERENCE.CASE.LOADING" : "加载案例模型...", - "PROPERTY.CASEREFERENCE.CASE.EMPTY" : "此文件夹不包含任何案例模型" -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/zh-TW.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/zh-TW.json deleted file mode 100644 index b7643de5..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/i18n/zh-TW.json +++ /dev/null @@ -1,2770 +0,0 @@ -{ - "GENERAL" : { - "MAIN-TITLE": "Flowable编辑器", - "NAVIGATION" : { - "PROCESSES": "流程", - "CASEMODELS": "案例模型", - "FORMS": "表单", - "DECISIONS": "决策表", - "APPS": "应用程序" - }, - "TITLE": { - "SELECT-GROUP" :"选择组", - "MATCHING-GROUPS": "匹配组", - "FILTER": "过滤", - "HISTORY": "历史" - }, - "ACTION": { - "LOGOUT": "退出", - "DASHBOARD": "Dashboard", - "RETURN-TO-LIST": "显示所有定义", - "CANCEL": "取消", - "CLOSE": "关闭", - "EDIT": "编辑", - "SAVE": "保存", - "OPEN": "打开", - "OK": "Ok", - "CONFIRM": "确认", - "CONFIRM-AND-CLOSE": "确认并且关闭", - "NEW-FORM": "新表单", - "CREATE-FORM": "创建表单", - "NEW-DECISION-TABLE": "新决策表", - "CREATE-DECISION-TABLE": "创建决策表" - }, - "MESSAGE": { - "SELECT-GROUP-HELP": "使用 ↑ 和 ↓ 选择并按回车确认", - "PEOPLE-NO-MATCHING-RESULTS": "没有找到匹配的用户", - "GROUP-NO-MATCHING-RESULTS": "没有找到匹配的组", - "GROUP-SOURCE-TYPE": "组源", - "GROUP-SOURCE-SEARCH-OPTION": "组搜索", - "GROUP-SOURCE-FIELD-OPTION": "表单字段" - }, - "OTHERS" : { - "PROCESS" : "流程", - "PROCESS_NAVIGATOR" : "流程导航", - "NO_STRUCTURAL_ELEMENTS_USED" : "未使用结构元素。" - } - }, - - "BPMN" : { - "TITLE": "BPMN 2.0标准工具", - "DESCRIPTION" : "BPMN流程编辑器", - "PROPERTYPACKAGES" : { - "PROCESS_IDPACKAGE" : { - "PROCESS_ID" : { - "TITLE" : "流程标识", - "DESCRIPTION" : "进程定义的唯一标识符。" - } - }, - "OVERRIDEIDPACKAGE" : { - "OVERRIDEID" : { - "TITLE" : "主键ID", - "DESCRIPTION" : "元素的唯一标识" - } - }, - "NAMEPACKAGE" : { - "NAME" : { - "TITLE" : "名称", - "DESCRIPTION" : "BPMN元素的描述名称." - } - }, - "DOCUMENTATIONPACKAGE" : { - "DOCUMENTATION" : { - "TITLE" : "描述信息", - "DESCRIPTION" : "BPMN元素的描述信息" - } - }, - "CATEGORYPACKAGE" : { - "CATEGORYDEFINITION" : { - "TITLE" : "分类", - "DESCRIPTION" : "BPMN元素的分类." - } - }, - "PROCESS_AUTHORPACKAGE" : { - "PROCESS_AUTHOR" : { - "TITLE" : "流程作者", - "DESCRIPTION" : "流程定义的作者." - } - }, - "PROCESS_VERSIONPACKAGE" : { - "PROCESS_VERSION" : { - "TITLE" : "流程版本字符串(仅备注)", - "DESCRIPTION" : "文档的目的为版本标识" - } - }, - "PROCESS_HISTORYLEVELPACKAGE" : { - "PROCESS_HISTORYLEVEL" : { - "TITLE" : "为此流程定义设置特定的历史级别", - "DESCRIPTION" : "为此流程定义设置特定的历史级别" - } - }, - "ISEXECUTABLEPACKAGE" : { - "ISEXECUTABLE" : { - "TITLE" : "是否可执行", - "DESCRIPTION" : "这个流程是可执行的吗?" - } - }, - "PROCESS_POTENTIALSTARTERUSERPACKAGE" : { - "PROCESS_POTENTIALSTARTERUSER" : { - "TITLE" : "流程启动者", - "DESCRIPTION" : "哪个用户,可以启动流程?" - } - }, - "PROCESS_POTENTIALSTARTERGROUPPACKAGE" : { - "PROCESS_POTENTIALSTARTERGROUP" : { - "TITLE" : "流程启动者组", - "DESCRIPTION" : "哪个组,可以启动流程?" - } - }, - "PROCESS_NAMESPACEPACKAGE" : { - "PROCESS_NAMESPACE" : { - "TITLE" : "目标命名空间", - "DESCRIPTION" : "流程定义的目标命名空间" - } - }, - "PROCESS_ISEAGEREXECUTIONFETCHPACKAGE" : { - "ISEAGEREXECUTIONFETCH" : { - "TITLE" : "即时执行抓取", - "DESCRIPTION" : "是否为该流程定义启用即时执行抓取" - } - }, - "ASYNCHRONOUSDEFINITIONPACKAGE" : { - "ASYNCHRONOUSDEFINITION" : { - "TITLE" : "异步", - "DESCRIPTION" : "定义异步的活动" - } - }, - "DATAPROPERTIESPACKAGE" : { - "DATAPROPERTIES" : { - "TITLE" : "数据对象", - "DESCRIPTION" : "数据对象属性的定义" - } - }, - "EXCLUSIVEDEFINITIONPACKAGE" : { - "EXCLUSIVEDEFINITION" : { - "TITLE" : "独占任务", - "DESCRIPTION" : "定义排它的活动" - } - }, - "EXECUTIONLISTENERSPACKAGE" : { - "EXECUTIONLISTENERS" : { - "TITLE" : "执行监听器", - "DESCRIPTION" : "活动、流程、流程跳转,开始、结事事件的监听器" - } - }, - "TASKLISTENERSPACKAGE" : { - "TASKLISTENERS" : { - "TITLE" : "任务监听器", - "DESCRIPTION" : "人工任务的监听器" - } - }, - "EVENTLISTENERSPACKAGE" : { - "EVENTLISTENERS" : { - "TITLE" : "事件监听器", - "DESCRIPTION" : "监听Flowable引擎的任何发生的事件. 同样可能是任何抛出的信号、信息、出错的事件。" - } - }, - "USERTASKASSIGNMENTPACKAGE" : { - "USERTASKASSIGNMENT" : { - "TITLE" : "分配用户", - "DESCRIPTION" : "分配任务给用户" - } - }, - "FORMPROPERTIESPACKAGE" : { - "FORMPROPERTIES" : { - "TITLE" : "动态表单属性", - "DESCRIPTION" : "定义带有属性列表的表单" - } - }, - "FORMKEYDEFINITIONPACKAGE" : { - "FORMKEYDEFINITION" : { - "TITLE" : "表单的标识", - "DESCRIPTION" : "表单的Key(指向关联的表单)" - } - }, - "FORMFIELDVALIDATIONPACKAGE" : { - "FORMFIELDVALIDATION" : { - "TITLE" : "验证表单字段", - "DESCRIPTION" : "验证表单提交上的表单字段。(允许的值是“true”、“false”或表达式)" - } - }, - "DUEDATEDEFINITIONPACKAGE" : { - "DUEDATEDEFINITION" : { - "TITLE" : "到期时间", - "DESCRIPTION" : "用户任务到期时间" - } - }, - "PRIORITYDEFINITIONPACKAGE" : { - "PRIORITYDEFINITION" : { - "TITLE" : "优先级", - "DESCRIPTION" : "用户任务的优先级" - } - }, - "SERVICETASKCLASSPACKAGE" : { - "SERVICETASKCLASS" : { - "TITLE" : "类", - "DESCRIPTION" : "实现服务任务逻辑的类" - } - }, - "SERVICETASKEXPRESSIONPACKAGE" : { - "SERVICETASKEXPRESSION" : { - "TITLE" : "表达式", - "DESCRIPTION" : "定义服务任务逻辑的表达式" - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE" : { - "SERVICETASKDELEGATEEXPRESSION" : { - "TITLE" : "委托表达式", - "DESCRIPTION" : "通过代理表达式定义任务服务逻辑" - } - }, - "SERVICETASKFIELDSPACKAGE" : { - "SERVICETASKFIELDS" : { - "TITLE" : "类中的字段", - "DESCRIPTION" : "字段扩展" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKRESULTVARIABLE" : { - "TITLE" : "结果变量名", - "DESCRIPTION" : "流程变量存储服务任务的执行结果" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE" : { - "SERVICETASKUSELOCALSCOPEFORRESULTVARIABLE" : { - "TITLE" : "对结果变量使用局部作用域", - "DESCRIPTION" : "标记需要将使用的结果变量保存为局部变量" - } - }, - "SERVICETASKTRIGGERABLEPACKAGE" : { - "SERVICETASKTRIGGERABLE" : { - "TITLE" : "将服务任务设置为可触发的", - "DESCRIPTION" : "将服务任务设置为可触发的" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "使結果變量瞬變", - "DESCRIPTION" : "指示存储結果變量变量瞬态的标志" - } - }, - "SCRIPTFORMATPACKAGE" : { - "SCRIPTFORMAT" : { - "TITLE" : "脚本格式", - "DESCRIPTION" : "脚本任务的脚本格式化" - } - }, - "SCRIPTTEXTPACKAGE" : { - "SCRIPTTEXT" : { - "TITLE" : "脚本", - "DESCRIPTION" : "脚本任务的脚本文本" - } - }, - "SCRIPTAUTOSTOREVARIABLESPACKAGE" : { - "SCRIPTAUTOSTOREVARIABLES" : { - "TITLE" : "自动存储变量", - "DESCRIPTION" : "自动存储流程的所有脚本变量" - } - }, - "SHELLCOMMANDPACKAGE" : { - "SHELLCOMMAND" : { - "TITLE" : "命令", - "DESCRIPTION" : "Shell任务命令" - } - }, - "SHELLARG1PACKAGE" : { - "SHELLARG1" : { - "TITLE" : "参数1", - "DESCRIPTION" : "Shell 命令的参数1" - } - }, - "SHELLARG2PACKAGE" : { - "SHELLARG2" : { - "TITLE" : "参数2", - "DESCRIPTION" : "Shell 命令的参数2" - } - }, - "SHELLARG3PACKAGE" : { - "SHELLARG3" : { - "TITLE" : "参数3", - "DESCRIPTION" : "Shell 命令的参数3" - } - }, - "SHELLARG4PACKAGE" : { - "SHELLARG4" : { - "TITLE" : "参数4", - "DESCRIPTION" : "Shell 命令的参数4" - } - }, - "SHELLARG5PACKAGE" : { - "SHELLARG5" : { - "TITLE" : "参数5", - "DESCRIPTION" : "Shell 命令的参数5" - } - }, - "SHELLWAITPACKAGE" : { - "SHELLWAIT" : { - "TITLE" : "等待", - "DESCRIPTION" : "等待shell命令执行结束的标志" - } - }, - "SHELLOUTPUTVARIABLEPACKAGE" : { - "SHELLOUTPUTVARIABLE" : { - "TITLE" : "输出变量", - "DESCRIPTION" : "存储shell 命令的输出变量" - } - }, - "SHELLERRORCODEVARIABLEPACKAGE" : { - "SHELLERRORCODEVARIABLE" : { - "TITLE" : "错误代码变量", - "DESCRIPTION" : "存储shell 命令错误代码的变量" - } - }, - "SHELLREDIRECTERRORPACKAGE" : { - "SHELLREDIRECTERROR" : { - "TITLE" : "重定向错误", - "DESCRIPTION" : "当设置为true,使用标准输出合并错误输出" - } - }, - "SHELLCLEANENVPACKAGE" : { - "SHELLCLEANENV" : { - "TITLE" : "清除环境变量", - "DESCRIPTION" : "清理shell执行环境" - } - }, - "SHELLDIRECTORYPACKAGE" : { - "SHELLDIRECTORY" : { - "TITLE" : "Shell目录", - "DESCRIPTION" : "Shell 进程工作目录" - } - }, - "RULETASK_RULESPACKAGE" : { - "RULETASK_RULES" : { - "TITLE" : "规则", - "DESCRIPTION" : "规则任务的规则" - } - }, - "RULETASK_VARIABLES_INPUTPACKAGE" : { - "RULETASK_VARIABLES_INPUT" : { - "TITLE" : "输入变量", - "DESCRIPTION" : "规则任务的输入变量" - } - }, - "RULETASK_EXCLUDEPACKAGE" : { - "RULETASK_EXCLUDE" : { - "TITLE" : "排除", - "DESCRIPTION" : "使用作为排它性的规则属性" - } - }, - "RULETASK_RESULTPACKAGE" : { - "RULETASK_RESULT" : { - "TITLE" : "结果变量", - "DESCRIPTION" : "规则任务的结果变量" - } - }, - "MAILTASKHEADERSPACKAGE" : { - "MAILTASKHEADERS" : { - "TITLE" : "邮件头", - "DESCRIPTION" : "行分隔邮件头(例如-x-attribute:value)。" - } - }, - "MAILTASKTOPACKAGE" : { - "MAILTASKTO" : { - "TITLE" : "接收人", - "DESCRIPTION" : "接收者,格式为邮件。多个接收者请用逗号分割的列表来定义" - } - }, - "MAILTASKFROMPACKAGE" : { - "MAILTASKFROM" : { - "TITLE" : "发件人", - "DESCRIPTION" : "发送者的邮箱.若不提供,默认将使用配置中的来源地址." - } - }, - "MAILTASKSUBJECTPACKAGE" : { - "MAILTASKSUBJECT" : { - "TITLE" : "主题", - "DESCRIPTION" : "Email中的主题" - } - }, - "MAILTASKCCPACKAGE" : { - "MAILTASKCC" : { - "TITLE" : "抄送", - "DESCRIPTION" : "抄送的Email地址,多个接收者请用逗号分隔开。" - } - }, - "MAILTASKBCCPACKAGE" : { - "MAILTASKBCC" : { - "TITLE" : "密送", - "DESCRIPTION" : "密送的Email地址. 多个接收者请用逗号分隔开" - } - }, - "MAILTASKTEXTPACKAGE" : { - "MAILTASKTEXT" : { - "TITLE" : "正文", - "DESCRIPTION" : "Email中的内容, 案例一需要发送纯文件的邮件. 可使用Html格式的邮件进行发送,若邮件的接收的客户端不支持这种格式,客户端可转为纯文本的邮件" - } - }, - "MAILTASKHTMLPACKAGE" : { - "MAILTASKHTML" : { - "TITLE" : "Html", - "DESCRIPTION" : "HTML中的一片段作为邮件的内容." - } - }, - "MAILTASKCHARSETPACKAGE" : { - "MAILTASKCHARSET" : { - "TITLE" : "字符集", - "DESCRIPTION" : "对于很多非英语语言来说,允许更改邮件的编码设置是必要的 " - } - }, - "HTTPTASKREQUESTMETHODPACKAGE" : { - "HTTPTASKREQUESTMETHOD" : { - "TITLE" : "请求方法", - "DESCRIPTION" : "请求方法(例如 - GET,POST,PUT等)。" - } - }, - "HTTPTASKREQUESTURLPACKAGE" : { - "HTTPTASKREQUESTURL" : { - "TITLE" : "请求 URL", - "DESCRIPTION" : "请求URL(例如 - http://flowable.org)。" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE" : { - "HTTPTASKREQUESTHEADERS" : { - "TITLE" : "请求头", - "DESCRIPTION" : "行分隔的HTTP请求标头(例如 - Content-Type:application/json)。" - } - }, - "HTTPTASKREQUESTBODYPACKAGE" : { - "HTTPTASKREQUESTBODYPACKAGE" : { - "TITLE" : "请求体", - "DESCRIPTION" : "请求正文(例如 - ${sampleBody})。" - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE" : { - "HTTPTASKREQUESTBODYENCODING" : { - "TITLE" : "请求体编码", - "DESCRIPTION" : "请求正文编码(例如-UTF-8)。" - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE" : { - "HTTPTASKREQUESTTIMEOUT" : { - "TITLE" : "请求超时时间(ms)", - "DESCRIPTION" : "请求超时(以毫秒为单位)(例如 - 5000)。" - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE" : { - "HTTPTASKDISALLOWREDIRECTS" : { - "TITLE" : "不允许重定向", - "DESCRIPTION" : "不允许HTTP重定向的标记。" - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE" : { - "HTTPTASKFAILSTATUSCODES" : { - "TITLE" : "失败时状态码", - "DESCRIPTION" : "逗号分隔的HTTP响应状态代码列表以重试,例如400,5XX。" - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE" : { - "HTTPTASKHANDLESTATUSCODES" : { - "TITLE" : "处理状态码", - "DESCRIPTION" : "要忽略的逗号分隔的HTTP响应状态代码列表,例如404,3XX。" - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE" : { - "HTTPTASKIGNOREEXCEPTION" : { - "TITLE" : "忽略异常", - "DESCRIPTION" : "标记以忽略异常。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT" : { - "TITLE" : "将响应保存为瞬态变量", - "DESCRIPTION" : "指示存储响应变量瞬态的标志" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE" : { - "HTTPTASKSAVERESPONSEASJSON" : { - "TITLE" : "将响应保存为JSON", - "DESCRIPTION" : "指示将响应变量存储为JSON变量而不是String的标志" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that when using parallel gateways multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the process is faster." - } - }, - "SKIPEXPRESSIONPACKAGE" : { - "SKIPEXPRESSION" : { - "TITLE" : "跳过表达式", - "DESCRIPTION" : "跳过与任务或关联关联的表达式执行与否。" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE" : { - "HTTPTASKRESPONSEVARIABLENAME" : { - "TITLE" : "响应变量名", - "DESCRIPTION" : "定义变量名称以存储http响应。" - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE" : { - "HTTPTASKSAVEREQUESTVARIABLES" : { - "TITLE" : "保存请求变量", - "DESCRIPTION" : "用于保存请求变量的标志。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE" : { - "HTTPTASKSAVERESPONSEPARAMETERS" : { - "TITLE" : "保存响应状态、头", - "DESCRIPTION" : "用于保存响应状态,标题等的标志" - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE" : { - "HTTPTASKRESULTVARIABLEPREFIX" : { - "TITLE" : "结果变量的前缀", - "DESCRIPTION" : "执行变量名称的前缀。" - } - }, - "CALLACTIVITYCALLEDELEMENTPACKAGE" : { - "CALLACTIVITYCALLEDELEMENT" : { - "TITLE" : "被调用元素", - "DESCRIPTION" : "流程引用" - } - }, - "CALLACTIVITYCALLEDELEMENTTYPEPACKAGE" : { - "CALLACTIVITYCALLEDELEMENTTYPE" : { - "TITLE" : "被调用元素类型", - "DESCRIPTION" : "使用流程参考的类型。." - } - }, - "CALLACTIVITYINPARAMETERSPACKAGE" : { - "CALLACTIVITYINPARAMETERS" : { - "TITLE" : "输入参数", - "DESCRIPTION" : "定义输入参数" - } - }, - "CALLACTIVITYOUTPARAMETERSPACKAGE" : { - "CALLACTIVITYOUTPARAMETERS" : { - "TITLE" : "输出参数", - "DESCRIPTION" : "输出参数的定义" - } - }, - "CALLACTIVITYINHERITVARIABLESPACKAGE" : { - "CALLACTIVITYINHERITVARIABLES" : { - "TITLE" : "在子流程中继承变量", - "DESCRIPTION" : "在子流程中继承父流程变量。" - } - }, - "CALLACTIVITYSAMEDEPLOYMENTPACKAGE" : { - "CALLACTIVITYSAMEDEPLOYMENT" : { - "TITLE" : "从相同的部署中启动引用的流程", - "DESCRIPTION" : "使用同一部署中引用的流程。" - } - }, - "CALLACTIVITYFALLBACKTODEFAULTTENANTPACKAGE" : { - "CALLACTIVITYFALLBACKTODEFAULTTENANT" : { - "TITLE" : "回退到默认租户", - "DESCRIPTION" : "当前租户搜索失败时,在默认租户中按键查找定义。" - } - }, - "CALLACTIVITYPROCESSINSTANCENAMEPACKAGE" : { - "CALLACTIVITYPROCESSINSTANCENAME" : { - "TITLE" : "流程实例名称", - "DESCRIPTION" : "解析为子流程实例名称的表达式" - } - }, - "CALLACTIVITYINHERITBUSINESSKEYPACKAGE" : { - "CALLACTIVITYINHERITBUSINESSKEY" : { - "TITLE" : "继承业务键", - "DESCRIPTION" : "从父流程继承业务键。" - } - }, - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERSPACKAGE" : { - "CALLACTIVITYUSELOCALSCOPEFOROUTPARAMETERS" : { - "TITLE" : "对输出参数使用局部作用域", - "DESCRIPTION" : "对输出参数使用局部变量范围。" - } - }, - "CALLACTIVITYBUSINESSKEYPACKAGE" : { - "CALLACTIVITYBUSINESSKEY" : { - "TITLE" : "业务键表达式", - "DESCRIPTION" : "解析为子流程实例的业务键的表达式" - } - }, - "CALLACTIVITYCOMPLETEASYNCPACKAGE" : { - "CALLACTIVITYCOMPLETEASYNC" : { - "TITLE" : "完成异步", - "DESCRIPTION" : "如果设置,则子流程结束并完成调用活动是异步完成的。将并行多实例与具有异步任务的被调用流程定义一起使用时非常有用。" - } - }, - "CAMELTASKCAMELCONTEXTPACKAGE" : { - "CAMELTASKCAMELCONTEXT" : { - "TITLE" : "驼峰内容", - "DESCRIPTION" : "可选的Camel 上下文定义,若为空,则使用系统缺省的." - } - }, - "MULETASKENDPOINTURLPACKAGE" : { - "MULETASKENDPOINTURL" : { - "TITLE" : "终端url", - "DESCRIPTION" : "发送消息到Mule的必须的端点URL" - } - }, - "MULETASKLANGUAGEPACKAGE" : { - "MULETASKLANGUAGE" : { - "TITLE" : "语言", - "DESCRIPTION" : "必须的语言定义来解析装载的表达式,如JUEL." - } - }, - "MULETASKPAYLOADEXPRESSIONPACKAGE" : { - "MULETASKPAYLOADEXPRESSION" : { - "TITLE" : "有效载荷表达式", - "DESCRIPTION" : "发送至Mule的必须执行的消息定义" - } - }, - "MULETASKRESULTVARIABLEPACKAGE" : { - "MULETASKRESULTVARIABLE" : { - "TITLE" : "返回变量", - "DESCRIPTION" : "可选的装载返回的结果的变量" - } - }, - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "CONDITIONSEQUENCEFLOWPACKAGE" : { - "TITLE" : "流条件", - "DESCRIPTION" : "流程跳线的条件定义" - } - }, - "DEFAULTFLOWPACKAGE" : { - "DEFAULTFLOW" : { - "TITLE" : "默认流", - "DESCRIPTION" : "将序列流定义为默认值" - } - }, - "CONDITIONALFLOWPACKAGE" : { - "CONDITIONALFLOW" : { - "TITLE" : "条件流", - "DESCRIPTION" : "用条件定义序列流" - } - }, - "TIMERCYCLEDEFINITIONPACKAGE" : { - "TIMERCYCLEDEFINITION" : { - "TITLE" : "循环时间(例:R3/PT10H)", - "DESCRIPTION" : "定义ISO-8601时间周期" - } - }, - "TIMERDATEDEFINITIONPACKAGE" : { - "TIMERDATEDEFINITION" : { - "TITLE" : "开始时间(ISO-8601)", - "DESCRIPTION" : "定义(ISO-8601格式标准)的定时器." - } - }, - "TIMERDURATIONDEFINITIONPACKAGE" : { - "TIMERDURATIONDEFINITION" : { - "TITLE" : "持续时间(例:PT5M)", - "DESCRIPTION" : "定义(ISO-8601)持续的定时器" - } - }, - "TIMERENDDATEDEFINITIONPACKAGE" : { - "TIMERENDDATEDEFINITION" : { - "TITLE" : "结束时间(ISO-8601)", - "DESCRIPTION" : "定义带(ISO-8601 duration)定时器." - } - }, - "MESSAGEREFPACKAGE" : { - "MESSAGEREF" : { - "TITLE" : "消息引用", - "DESCRIPTION" : "定义消息的名字。" - } - }, - "SIGNALREFPACKAGE" : { - "SIGNALREF" : { - "TITLE" : "信号引用", - "DESCRIPTION" : "定义信号的名称" - } - }, - "COMPENSATIONACTIVITYREFPACKAGE" : { - "COMPENSATIONACTIVITYREF" : { - "TITLE" : "補償活動參考", - "DESCRIPTION" : "定義活動參考。" - } - }, - "ERRORREFPACKAGE" : { - "ERRORREF" : { - "TITLE" : "错误引用", - "DESCRIPTION" : "定义错误名称" - } - }, - "ESCALATIONREFPACKAGE" : { - "ESCALATIONREF" : { - "TITLE" : "升级引用", - "DESCRIPTION" : "定义升级名称" - } - }, - "CONDITIONALEVENTPACKAGE" : { - "CONDITION" : { - "TITLE" : "条件表达式", - "DESCRIPTION" : "定义条件表达式." - } - }, - "CANCELACTIVITYPACKAGE" : { - "CANCELACTIVITY" : { - "TITLE" : "取消活动", - "DESCRIPTION" : "活动是否应取消?" - } - }, - "INITIATORPACKAGE" : { - "INITIATOR" : { - "TITLE" : "发起人", - "DESCRIPTION" : "流程的发起方。" - } - }, - "TEXTPACKAGE" : { - "TEXT" : { - "TITLE" : "文本", - "DESCRIPTION" : "文本批注的文本。" - } - }, - "MULTIINSTANCE_TYPEPACKAGE" : { - "MULTIINSTANCE_TYPE" : { - "TITLE" : "多实例类型", - "DESCRIPTION" : "重复的活动执行(并行或顺序)可以通过不同的循环类型显示。" - } - }, - "MULTIINSTANCE_CARDINALITYPACKAGE" : { - "MULTIINSTANCE_CARDINALITY" : { - "TITLE" : "基数(多实例)", - "DESCRIPTION" : "定义多实例的基数" - } - }, - "MULTIINSTANCE_COLLECTIONPACKAGE" : { - "MULTIINSTANCE_COLLECTION" : { - "TITLE" : "集合(多实例)", - "DESCRIPTION" : "定义多实例的集合" - } - }, - "MULTIINSTANCE_VARIABLEPACKAGE" : { - "MULTIINSTANCE_VARIABLE" : { - "TITLE" : "元素变量(多实例)", - "DESCRIPTION" : "为多实例定义变量元素" - } - }, - "MULTIINSTANCE_CONDITIONPACKAGE" : { - "MULTIINSTANCE_CONDITION" : { - "TITLE" : "完成条件(多实例)", - "DESCRIPTION" : "定义多实例的完成条件" - } - }, - "ISFORCOMPENSATIONPACKAGE" : { - "ISFORCOMPENSATION" : { - "TITLE" : "是否为补偿", - "DESCRIPTION" : "标识此活动是否用于补偿的标志。" - } - }, - "SEQUENCEFLOWORDERPACKAGE" : { - "SEQUENCEFLOWORDER" : { - "TITLE" : "流顺序", - "DESCRIPTION" : "流程走向的顺序" - } - }, - "SIGNALDEFINITIONSPACKAGE" : { - "SIGNALDEFINITIONS" : { - "TITLE" : "信号定义", - "DESCRIPTION" : "信号定义" - } - }, - "MESSAGEDEFINITIONSPACKAGE" : { - "MESSAGEDEFINITIONS" : { - "TITLE" : "消息定义", - "DESCRIPTION" : "消息定义" - } - }, - "ESCALATIONDEFINITIONSPACKAGE" : { - "ESCALATIONDEFINITIONS" : { - "TITLE" : "升级的定义", - "DESCRIPTION" : "升级的定义" - } - }, - - "EVENTREGISTRYPACKAGE" : { - "EVENTKEY" : { - "TITLE" : "事件key", - "DESCRIPTION" : "事件key定义" - }, - "EVENTNAME" : { - "TITLE" : "事件名称", - "DESCRIPTION" : "事件名称定义" - }, - "EVENTINPARAMETERS" : { - "TITLE" : "事件载体映射", - "DESCRIPTION" : "将流程变量映射到事件有效载体的属性" - }, - "EVENTOUTPARAMETERS" : { - "TITLE" : "从事件有效载体映射到流程", - "DESCRIPTION" : "将事件有效载体的属性映射到流程变量" - }, - "EVENTCORRELATIONPARAMETERS" : { - "TITLE" : "相关参数", - "DESCRIPTION" : "相关参数定义" - }, - "CHANNELKEY" : { - "TITLE" : "通道key", - "DESCRIPTION" : "通道key定义" - }, - "CHANNELNAME" : { - "TITLE" : "通道名称", - "DESCRIPTION" : "通道名称定义" - }, - "CHANNELTYPE" : { - "TITLE" : "通道类型", - "DESCRIPTION" : "通道类型定义" - }, - "CHANNELDESTINATION" : { - "TITLE" : "通道目的地", - "DESCRIPTION" : "通道目的地定义" - }, - "TRIGGEREVENTKEY" : { - "TITLE" : "触发事件key", - "DESCRIPTION" : "触发事件key定义" - }, - "TRIGGEREVENTNAME" : { - "TITLE" : "触发事件名称", - "DESCRIPTION" : "触发事件名称定义" - }, - "TRIGGERCHANNELKEY" : { - "TITLE" : "触发管道key", - "DESCRIPTION" : "触发管道key定义" - }, - "TRIGGERCHANNELNAME" : { - "TITLE" : "触发管道名称", - "DESCRIPTION" : "触发管道名称" - }, - "TRIGGERCHANNELTYPE" : { - "TITLE" : "触发通道类型", - "DESCRIPTION" : "触发通道类型定义" - }, - "TRIGGERCHANNELDESTINATION" : { - "TITLE" : "触发通道目的地", - "DESCRIPTION" : "触发通道目的地定义" - }, - "KEYDETECTIONFIXEDVALUE" : { - "TITLE" : "事件key固定值", - "DESCRIPTION" : "事件key固定值定义" - }, - "KEYDETECTIONJSONFIELD" : { - "TITLE" : "事件key json 字段", - "DESCRIPTION" : "事件key json 字段" - }, - "KEYDETECTIONJSONPOINTER" : { - "TITLE" : "事件key json 指针", - "DESCRIPTION" : "事件key json 指针" - } - }, - "ISTRANSACTIONPACKAGE" : { - "ISTRANSACTION" : { - "TITLE" : "是事务子流程", - "DESCRIPTION" : "标识此子流程是否为事务类型的标志。" - } - }, - "FORMREFERENCEPACKAGE" : { - "FORMREFERENCE" : { - "TITLE" : "表单引用", - "DESCRIPTION" : "关联到一个表单" - } - }, - "TERMINATEALLPACKAGE" : { - "TERMINATEALL" : { - "TITLE" : "终止所有", - "DESCRIPTION" : "启用以终止流程实例" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE" : { - "DECISIONTASKDECISIONTABLEREFERENCE" : { - "TITLE" : "决策表参考", - "DESCRIPTION" : "设置决策表引用" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE" : { - "DECISIONTASKTHROWERRORONNOHITS" : { - "TITLE" : "如果未命中任何规则,则引发错误", - "DESCRIPTION" : "如果未命中决策表的规则,因而找不到结果,则应引发错误。" - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE" : { - "DECISIONTASKFALLBACKTODEFAULTTENANT" : { - "TITLE" : "回退到默认租户", - "DESCRIPTION" : "当上一次尝试用租户查找决策定义失败时,查找不带租户的决策定义。" - } - }, - "INTERRUPTINGPACKAGE" : { - "INTERRUPTING" : { - "TITLE" : "中断", - "DESCRIPTION" : "是否应终止所有父级执行?" - } - }, - "COMPLETIONCONDITIONPACKAGE" : { - "COMPLETIONCONDITION" : { - "TITLE" : "完成条件", - "DESCRIPTION" : "自组网子流程的完成条件" - } - }, - "ORDERINGPACKAGE" : { - "ORDERING" : { - "TITLE" : "排序", - "DESCRIPTION" : "自组网子流程的排序" - } - }, - "CANCELREMAININGINSTANCESPACKAGE" : { - "CANCELREMAININGINSTANCES" : { - "TITLE" : "取消剩余的实例", - "DESCRIPTION" : "取消自组网子流程的剩余实例?" - } - } - - }, - "STENCILS" : { - "GROUPS" : { - "STARTEVENTS" : "启动事件", - "ENDEVENTS" : "结束事件", - "DIAGRAM" : "图解", - "ACTIVITIES" : "活动", - "STRUCTURAL" : "结构", - "GATEWAYS" : "网关", - "BOUNDARYEVENTS" : "边界事件", - "INTERMEDIATECATCHINGEVENTS" : "中间捕捉事件", - "INTERMEDIATETHROWINGEVENTS" : "中间抛出事件", - "SWIMLANES" : "泳道", - "CONNECTINGOBJECTS" : "连接对象", - "ARTIFACTS" : "工件" - }, - "BPMNDIAGRAM" : { - "TITLE" : "BPMN流程图", - "DESCRIPTION" : "BPMN 2.0 流程图." - }, - "STARTNONEEVENT" : { - "TITLE" : "空启动事件", - "DESCRIPTION" : "无特定触发器的启动事件" - }, - "STARTTIMEREVENT" : { - "TITLE" : "定时器启动事件", - "DESCRIPTION" : "带定时器触发的启动事件" - }, - "STARTSIGNALEVENT" : { - "TITLE" : "信号启动事件", - "DESCRIPTION" : "通过信号触发启动事件" - }, - "STARTMESSAGEEVENT" : { - "TITLE" : "消息启动事件", - "DESCRIPTION" : "通过消息触发启动事件" - }, - "STARTCONDITIONALEVENT" : { - "TITLE" : "条件启动事件", - "DESCRIPTION" : "通过条件触发启动事件" - }, - "STARTERROREVENT" : { - "TITLE" : "异常启动事件", - "DESCRIPTION" : "用于捕获BPMN抛出的异常启动事件" - }, - "STARTESCALATIONEVENT" : { - "TITLE" : "升级开始事件", - "DESCRIPTION" : "捕获抛出的BPMN升级的启动事件" - }, - "STARTEVENTREGISTRYEVENT" : { - "TITLE" : "注册开始事件", - "DESCRIPTION" : "注册开始事件" - }, - "STARTVARIABLELISTENEREVENT" : { - "TITLE" : "变量监听启动事件", - "DESCRIPTION" : "监听变量变更的启动事件" - }, - - "USERTASK" : { - "TITLE" : "用户任务", - "DESCRIPTION" : "分配给特定人的任务" - }, - "SERVICETASK" : { - "TITLE" : "服务任务", - "DESCRIPTION" : "带有服务逻辑的自动任务" - }, - "SCRIPTTASK" : { - "TITLE" : "脚本任务", - "DESCRIPTION" : "带有脚本逻辑的自动任务" - }, - "BUSINESSRULE" : { - "TITLE" : "业务规则任务", - "DESCRIPTION" : "带有业务规则的自动任务" - }, - "RECEIVETASK" : { - "TITLE" : "接收任务", - "DESCRIPTION" : "等待接收信号来触发的任务" - }, - "RECEIVEEVENTTASK" : { - "TITLE" : "接收事件任务", - "DESCRIPTION" : "接收事件任务" - }, - "MANUALTASK" : { - "TITLE" : "手动任务", - "DESCRIPTION" : "不带任何逻辑的自动任务" - }, - "MAILTASK" : { - "TITLE" : "邮件任务", - "DESCRIPTION" : "邮件任务" - }, - "CAMELTASK" : { - "TITLE" : "驼峰任务", - "DESCRIPTION" : "发送消息给Camel容器的任务" - }, - "HTTPTASK" : { - "TITLE" : "Http任务", - "DESCRIPTION" : "Http任务" - }, - "MULETASK" : { - "TITLE" : "Mule任务", - "DESCRIPTION" : "An task that sends a message to Mule" - }, - "SENDTASK" : { - "TITLE" : "发送任务", - "DESCRIPTION" : "发送消息的任务" - }, - "DECISIONTASK" : { - "TITLE" : "决策任务", - "DESCRIPTION" : "使用Flowable DMN规则引擎的任务" - }, - "SHELLTASK" : { - "TITLE" : "Shell任务", - "DESCRIPTION" : "具有shell批处理逻辑的自动任务" - }, - "SUBPROCESS" : { - "TITLE" : "子流程", - "DESCRIPTION" : "子流程范围" - }, - "SENDEVENTTASK" : { - "TITLE" : "事件发送任务", - "DESCRIPTION" : "事件发送任务" - }, - "EXTERNALWORKERTASK" : { - "TITLE" : "外部工作任务", - "DESCRIPTION" : "外部工作任务" - }, - - "COLLAPSEDSUBPROCESS" : { - "TITLE" : "折叠子流程", - "DESCRIPTION" : "子流程范围" - }, - "EVENTSUBPROCESS" : { - "TITLE" : "事件子流程", - "DESCRIPTION" : "事件子流程范围" - }, - "CALLACTIVITY" : { - "TITLE" : "调用活动", - "DESCRIPTION" : "一个调用活动" - }, - "EXCLUSIVEGATEWAY" : { - "TITLE" : "排他网关", - "DESCRIPTION" : "一个选择的网关" - }, - "PARALLELGATEWAY" : { - "TITLE" : "并行网关", - "DESCRIPTION" : "一个并行的网关" - }, - "INCLUSIVEGATEWAY" : { - "TITLE" : "包容网关", - "DESCRIPTION" : "一个包容性网关" - }, - "EVENTGATEWAY" : { - "TITLE" : "事件网关", - "DESCRIPTION" : "一个事件网关" - }, - "BOUNDARYCONDITIONALEVENT" : { - "TITLE" : "边界条件事件", - "DESCRIPTION" : "捕获指定条件的边界事件" - }, - "BOUNDARYERROREVENT" : { - "TITLE" : "边界错误事件", - "DESCRIPTION" : "捕捉bpmn错误的边界事件" - }, - "BOUNDARYESCALATIONEVENT" : { - "TITLE" : "边界升级事件", - "DESCRIPTION" : "捕获BPMN升级的边界事件" - }, - "BOUNDARYTIMEREVENT" : { - "TITLE" : "边界计时器事件", - "DESCRIPTION" : "具有计时器触发器的边界事件" - }, - "BOUNDARYSIGNALEVENT" : { - "TITLE" : "边界信号事件", - "DESCRIPTION" : "一个信号触发的边界事件" - }, - "BOUNDARYMESSAGEEVENT" : { - "TITLE" : "边界消息事件", - "DESCRIPTION" : "一个边界消息事件" - }, - "BOUNDARYCANCELEVENT" : { - "TITLE" : "边界取消事件", - "DESCRIPTION" : "一个边界取消事件" - }, - "BOUNDARYEVENTREGISTRYEVENT" : { - "TITLE" : "边界注册事件", - "DESCRIPTION" : "边界注册事件" - }, - "BOUNDARYVARIABLELISTENEREVENT" : { - "TITLE" : "边界变量监听事件", - "DESCRIPTION" : "边界变量监听事件" - }, - "BOUNDARYCOMPENSATIONEVENT" : { - "TITLE" : "边界补偿事件", - "DESCRIPTION" : "边界补偿事件" - }, - "CATCHTIMEREVENT" : { - "TITLE" : "中间计时器捕获事件", - "DESCRIPTION" : "使用计时器触发器的中间捕获事件" - }, - "CATCHSIGNALEVENT" : { - "TITLE" : "中间信号捕获事件", - "DESCRIPTION" : "带有信号触发器的中间捕获事件" - }, - "CATCHMESSAGEEVENT" : { - "TITLE" : "中间消息捕获事件", - "DESCRIPTION" : "带有消息触发器的中间捕获事件" - }, - "CATCHCONDITIONALEVENT" : { - "TITLE" : "中间条件捕获事件", - "DESCRIPTION" : "带有条件触发器的中间捕获事件" - }, - "CATCHEVENTREGISTRYEVENT" : { - "TITLE" : "中间事件注册捕获事件", - "DESCRIPTION" : "中间事件注册捕获事件" - }, - "CATCHVARIABLELISTENEREVENT": { - "TITLE" : "中间变量监听事件", - "DESCRIPTION" : "中间变量监听事件" - }, - "THROWNONEEVENT" : { - "TITLE" : "中间无抛出事件", - "DESCRIPTION" : "没有特定触发器的中间事件" - }, - "THROWSIGNALEVENT" : { - "TITLE" : "中间信号抛出事件", - "DESCRIPTION" : "带有信号触发器的中间事件" - }, - "THROWESCALATIONEVENT" : { - "TITLE" : "中间升级抛出事件", - "DESCRIPTION" : "具有升级触发器的中间事件" - }, - "THROWCOMPENSATIONEVENT": { - "TITLE" : "中間補償投擲事件", - "DESCRIPTION" : "帶有補償觸發器的中間事件" - }, - "ENDNONEEVENT" : { - "TITLE" : "结束事件", - "DESCRIPTION" : "没有特定触发器的结束事件" - }, - "ENDERROREVENT" : { - "TITLE" : "结束错误事件", - "DESCRIPTION" : "引发错误事件的结束事件" - }, - "ENDESCALATIONEVENT" : { - "TITLE" : "结束升级事件", - "DESCRIPTION" : "抛出升级事件的结束时间" - }, - "ENDCANCELEVENT" : { - "TITLE" : "结束取消事件", - "DESCRIPTION" : "取消结束事件" - }, - "ENDTERMINATEEVENT" : { - "TITLE" : "结束终止事件", - "DESCRIPTION" : "终止结束事件" - }, - "POOL" : { - "TITLE" : "池", - "DESCRIPTION" : "用于构造流程定义的池" - }, - "LANE" : { - "TITLE" : "泳道", - "DESCRIPTION" : "构建流程定义的泳道" - }, - "SEQUENCEFLOW" : { - "TITLE" : "顺序流", - "DESCRIPTION" : "序列流定义了活动的执行顺序。" - }, - "MESSAGEFLOW" : { - "TITLE" : "消息流", - "DESCRIPTION" : "用于连接不同池中的元素的消息流。" - }, - "ASSOCIATION" : { - "TITLE" : "关联", - "DESCRIPTION" : "将文本注释与元素关联。" - }, - "DATAASSOCIATION" : { - "TITLE" : "数据关联", - "DESCRIPTION" : "将数据元素与活动关联。" - }, - "TEXTANNOTATION" : { - "TITLE" : "文本注释", - "DESCRIPTION" : "用描述文本注释元素。" - }, - "DATASTORE" : { - "TITLE" : "数据存储", - "DESCRIPTION" : "对数据存储的引用。" - }, - "ADHOCSUBPROCESS" : { - "TITLE" : "自组网子流程", - "DESCRIPTION" : "自组网子流程" - } - } - }, - - "CMMN" : { - "TITLE": "CMMN编辑器", - "DESCRIPTION": "CMMN案例编辑器", - "PROPERTYPACKAGES": { - "CASE_IDPACKAGE": { - "CASE_ID": { - "TITLE": "案例标识符", - "DESCRIPTION": "案例定义的唯一标识符。" - } - }, - "OVERRIDEIDPACKAGE": { - "OVERRIDEID": { - "TITLE": "主键Id", - "DESCRIPTION": "元素的唯一标识符" - } - }, - "NAMEPACKAGE": { - "NAME": { - "TITLE": "案例名称", - "DESCRIPTION": "CMMN元素的描述性名称。" - } - }, - "DOCUMENTATIONPACKAGE": { - "DOCUMENTATION": { - "TITLE": "描述文档", - "DESCRIPTION": "CMMN元素的描述性名称。" - } - }, - "BLOCKINGPACKAGE": { - "ISBLOCKING": { - "TITLE": "阻塞", - "DESCRIPTION": "布尔属性,默认为true。如果为false,则任务将在执行任何关联逻辑后自动完成任务" - }, - "ISBLOCKINGEXPRESSION": { - "TITLE": "阻塞表达式", - "DESCRIPTION": "在运行时控制此任务是否阻塞的表达式。设置后,将忽略阻塞属性的值。" - } - }, - "CASE_INITIATORVARIABLENAMEPACKAGE": { - "CASE_INITIATORVARIABLENAME": { - "TITLE": "启动器变量名称", - "DESCRIPTION": "设置要用于案例启动程序值的变量名称。" - } - }, - "CASE_AUTHORPACKAGE": { - "CASE_AUTHOR": { - "TITLE": "案例作者", - "DESCRIPTION": "案例定义的作者" - } - }, - "CASE_VERSIONPACKAGE": { - "CASE_VERSION": { - "TITLE": "案例版本字符串(仅文档)", - "DESCRIPTION": "版本标识符用于文档目的。" - } - }, - "CASE_NAMESPACEPACKAGE": { - "CASE_NAMESPACE": { - "TITLE": "目标命名空间", - "DESCRIPTION": "案例定义的目标名称空间。" - } - }, - "USERTASKASSIGNMENTPACKAGE": { - "USERTASKASSIGNMENT": { - "TITLE": "分配任务", - "DESCRIPTION": "用户任务的分配定义" - } - }, - "TASKLISTENERSPACKAGE": { - "TASKLISTENERS": { - "TITLE": "任务监听器", - "DESCRIPTION": "人工任务的监听器" - } - }, - "FORMPROPERTIESPACKAGE": { - "FORMPROPERTIES": { - "TITLE": "表单属性", - "DESCRIPTION": "具有表单属性列表的表单定义" - } - }, - "FORMKEYDEFINITIONPACKAGE": { - "FORMKEYDEFINITION": { - "TITLE": "表单键", - "DESCRIPTION": "提供对表单的引用的表单键。" - } - }, - "FORMFIELDVALIDATIONPACKAGE": { - "FORMFIELDVALIDATION": { - "TITLE": "验证表单字段", - "DESCRIPTION": "在表单提交时验证表单字段。(允许值为“true”、“false”或表达式)" - } - }, - "DUEDATEDEFINITIONPACKAGE": { - "DUEDATEDEFINITION": { - "TITLE": "到期日", - "DESCRIPTION": "用户任务的截止日期" - } - }, - "PRIORITYDEFINITIONPACKAGE": { - "PRIORITYDEFINITION": { - "TITLE": "优先级", - "DESCRIPTION": "用户任务的优先级。" - } - }, - "SERVICETASKCLASSPACKAGE": { - "SERVICETASKCLASS": { - "TITLE": "类", - "DESCRIPTION": "实现服务任务逻辑的类。" - } - }, - "SERVICETASKEXPRESSIONPACKAGE": { - "SERVICETASKEXPRESSION": { - "TITLE": "表达式", - "DESCRIPTION": "用表达式定义的服务任务逻辑。" - } - }, - "SERVICETASKDELEGATEEXPRESSIONPACKAGE": { - "SERVICETASKDELEGATEEXPRESSION": { - "TITLE": "委托表达式", - "DESCRIPTION": "用委托表达式定义的服务任务逻辑。" - } - }, - "SERVICETASKFIELDSPACKAGE": { - "SERVICETASKFIELDS": { - "TITLE": "类字段", - "DESCRIPTION": "字段扩展" - } - }, - "SERVICETASKRESULTVARIABLEPACKAGE": { - "SERVICETASKRESULTVARIABLE": { - "TITLE": "结果变量名称", - "DESCRIPTION": "存储服务任务结果的进程变量名。" - } - }, - "ASYNCPACKAGE": { - "ISASYNC": { - "TITLE": "异步", - "DESCRIPTION": "指示是否需要异步执行任务。" - }, - "ISEXCLUSIVE": { - "TITLE": "独占", - "DESCRIPTION": "指示是否必须以独占方式执行异步任务" - } - }, - "MAILTASKHEADERSPACKAGE": { - "MAILTASKHEADERS": { - "TITLE": "报头", - "DESCRIPTION": "行分隔邮件头(例如 - X-Attribute: value)" - } - }, - "MAILTASKTOPACKAGE": { - "MAILTASKTO": { - "TITLE": "接收者", - "DESCRIPTION": "如果是电子邮件,则为收件人。在逗号分隔的列表中定义了多个收件人。" - } - }, - "MAILTASKFROMPACKAGE": { - "MAILTASKFROM": { - "TITLE": "发件者", - "DESCRIPTION": "发件人电子邮件地址。如果未提供,则使用从地址配置的默认值。" - } - }, - "MAILTASKSUBJECTPACKAGE": { - "MAILTASKSUBJECT": { - "TITLE": "主题", - "DESCRIPTION": "电子邮件的主题。" - } - }, - "MAILTASKCCPACKAGE": { - "MAILTASKCC": { - "TITLE": "抄送", - "DESCRIPTION": "电子邮件的抄送。在逗号分隔的列表中定义了多个收件人" - } - }, - "MAILTASKBCCPACKAGE": { - "MAILTASKBCC": { - "TITLE": "密送", - "DESCRIPTION": "电子邮件的密件抄送。在逗号分隔的列表中定义了多个收件人" - } - }, - "MAILTASKTEXTPACKAGE": { - "MAILTASKTEXT": { - "TITLE": "文本", - "DESCRIPTION": "电子邮件的内容,以防需要发送不丰富的普通电子邮件。可与HTML结合使用,用于不支持丰富内容的电子邮件客户端。然后,客户机将返回到此文本唯一的备选方案。" - } - }, - "MAILTASKHTMLPACKAGE": { - "MAILTASKHTML": { - "TITLE": "Html", - "DESCRIPTION": "一段HTML,它是电子邮件的内容。" - } - }, - "MAILTASKCHARSETPACKAGE": { - "MAILTASKCHARSET": { - "TITLE": "字符集", - "DESCRIPTION": "允许更改电子邮件的字符集,这对于许多非英语语言是必需的。" - } - }, - "TEXTPACKAGE": { - "TEXT": { - "TITLE": "文本", - "DESCRIPTION": "文本批注的文本。" - } - }, - "FORMREFERENCEPACKAGE": { - "FORMREFERENCE": { - "TITLE": "表单引用", - "DESCRIPTION": "一个表单的引用" - } - }, - "DECISIONTASKDECISIONTABLEREFERENCEPACKAGE": { - "DECISIONTASKDECISIONTABLEREFERENCE": { - "TITLE": "决策表参考", - "DESCRIPTION": "设置决策表引用" - } - }, - "DECISIONTASKTHROWERRORONNOHITSPACKAGE": { - "DECISIONTASKTHROWERRORONNOHITS": { - "TITLE": "如果未命中任何规则,则抛出错误", - "DESCRIPTION": "如果未命中决策表的规则,因而找不到结果,则应抛出错误。" - } - }, - "DECISIONTASKFALLBACKTODEFAULTTENANTPACKAGE": { - "DECISIONTASKFALLBACKTODEFAULTTENANT": { - "TITLE": "回退到默认租户", - "DESCRIPTION": "当上一次尝试用租户查找决策定义失败时,查找不带租户的决策定义。" - } - }, - "HTTPTASKREQUESTMETHODPACKAGE": { - "HTTPTASKREQUESTMETHOD": { - "TITLE": "请求方法", - "DESCRIPTION": "请求方法(例如GET、POST、PUT等)。" - } - }, - "HTTPTASKREQUESTURLPACKAGE": { - "HTTPTASKREQUESTURL": { - "TITLE": "请求URL", - "DESCRIPTION": "请求URL(例如-http://flowable.org)。" - } - }, - "HTTPTASKREQUESTHEADERSPACKAGE": { - "HTTPTASKREQUESTHEADERS": { - "TITLE": "请求头", - "DESCRIPTION": "行分隔的HTTP请求头(例如-content-type:application/json)。" - } - }, - "HTTPTASKREQUESTBODYPACKAGE": { - "HTTPTASKREQUESTBODY": { - "TITLE": "请求正文", - "DESCRIPTION": "请求主体(例如-$samplebody)。" - } - }, - "HTTPTASKREQUESTBODYENCODINGPACKAGE": { - "HTTPTASKREQUESTBODYENCODING": { - "TITLE": "请求正文编码", - "DESCRIPTION": "Request body encoding (For example- UTF-8)." - } - }, - "HTTPTASKREQUESTTIMEOUTPACKAGE": { - "HTTPTASKREQUESTTIMEOUT": { - "TITLE": "请求超时(ms)", - "DESCRIPTION": "请求超时(毫秒)(例如-5000)。" - } - }, - "HTTPTASKDISALLOWREDIRECTSPACKAGE": { - "HTTPTASKDISALLOWREDIRECTS": { - "TITLE": "不允许重定向", - "DESCRIPTION": "禁止HTTP重定向的标志。" - } - }, - "HTTPTASKFAILSTATUSCODESPACKAGE": { - "HTTPTASKFAILSTATUSCODES": { - "TITLE": "故障状态代码", - "DESCRIPTION": "以逗号分隔的要重试的HTTP响应状态代码列表,例如400,5xx。" - } - }, - "HTTPTASKHANDLESTATUSCODESPACKAGE": { - "HTTPTASKHANDLESTATUSCODES": { - "TITLE": "处理状态代码", - "DESCRIPTION": "要忽略的HTTP响应状态代码的逗号分隔列表,例如404、3xx。" - } - }, - "HTTPTASKIGNOREEXCEPTIONPACKAGE": { - "HTTPTASKIGNOREEXCEPTION": { - "TITLE": "忽略异常", - "DESCRIPTION": "忽略异常的标志。" - } - }, - "HTTPTASKRESPONSEVARIABLENAMEPACKAGE": { - "HTTPTASKRESPONSEVARIABLENAME": { - "TITLE": "响应变量名", - "DESCRIPTION": "定义存储HTTP响应的变量名。" - } - }, - "HTTPTASKSAVEREQUESTVARIABLESPACKAGE": { - "HTTPTASKSAVEREQUESTVARIABLES": { - "TITLE": "保存请求变量", - "DESCRIPTION": "保存请求变量的标志。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERS": { - "TITLE": "保存响应状态,标题", - "DESCRIPTION": "保存响应状态、标题等的标志。" - } - }, - "HTTPTASKRESULTVARIABLEPREFIXPACKAGE": { - "HTTPTASKRESULTVARIABLEPREFIX": { - "TITLE": "结果变量前缀", - "DESCRIPTION": "执行变量名称的前缀。" - } - }, - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENTPACKAGE": { - "HTTPTASKSAVERESPONSEPARAMETERSTRANSIENT": { - "TITLE": "将响应保存为瞬态变量", - "DESCRIPTION": "指示存储响应变量瞬态的标志" - } - }, - "HTTPTASKSAVERESPONSEASJSONPACKAGE": { - "HTTPTASKSAVERESPONSEASJSON": { - "TITLE": "将响应另存为JSON", - "DESCRIPTION": "指示将响应变量存储为JSON变量而不是字符串的标志" - } - }, - "HTTPTASKPARALLELINSAMETRANSACTIONPACKAGE" : { - "HTTPTASKPARALLELINSAMETRANSACTION" : { - "TITLE" : "Execute parallel in same transaction", - "DESCRIPTION" : "Flag indicating that the Http call should be done parallel in the same transaction. This means that multiple http tasks are executed in the same time in the same transaction and thus the entire execution of the case is faster." - } - }, - "CASETASKCASEREFERENCEPACKAGE": { - "CASETASKCASEREFERENCE": { - "TITLE": "案例参考", - "DESCRIPTION": "设置案例参考" - } - }, - "PROCESSTASKPROCESSREFERENCEPACKAGE": { - "PROCESSTASKPROCESSREFERENCE": { - "TITLE": "工艺参考", - "DESCRIPTION": "设置进程引用" - } - }, - "FALLBACKTODEFAULTTENANTPACKAGE": { - "FALLBACKTODEFAULTTENANT": { - "TITLE": "回退到默认租户", - "DESCRIPTION": "当指定租户中的键找不到定义时,使用默认租户作为回退" - } - }, - "PROCESSTASKINPARAMETERSPACKAGE": { - "PROCESSTASKINPARAMETERS": { - "TITLE": "在参数中", - "DESCRIPTION": "输入参数的定义" - } - }, - "PROCESSTASKOUTPARAMETERSPACKAGE": { - "PROCESSTASKOUTPARAMETERS": { - "TITLE": "输出参数", - "DESCRIPTION": "输出参数的定义" - } - }, - "TIMEREXPRESSIONPACKAGE": { - "TIMEREXPRESSION": { - "TITLE": "计时器表达式", - "DESCRIPTION": "一个iso-8601字符串或表达式,它解析为iso-8601字符串或java.util.Date。" - } - }, - "TIMERSTARTTRIGGERPACKAGE": { - "TIMERSTARTTRIGGERSOURCEREF": { - "TITLE": "启动触发计划项", - "DESCRIPTION": "对计划项的引用,为其配置的标准事件需要发生才能启动计时器(可选)" - }, - "TRANSITIONEVENT": { - "TITLE": "启动触发器转换事件", - "DESCRIPTION": "过渡事件的类型. 仅在设置开始触发计划项时使用" - } - }, - "DECISIONTASKDECISIONREFERENCEPACKAGE": { - "DECISIONTASKDECISIONREFERENCE": { - "TITLE": "决策参考", - "DESCRIPTION": "设置决策参考" - } - }, - "IFPARTCONDITIONPACKAGE": { - "IFPARTCONDITION": { - "TITLE": "条件", - "DESCRIPTION": "" - } - }, - "TRIGGERMODEPACKAGE": { - "TRIGGERMODE": { - "TITLE": "触发模式", - "DESCRIPTION": "确定是否使用内存(默认)为without(on event)评估哨兵条件。默认值意味着满足的哨兵部分(on和ifparts)将被存储。当重新评估哨兵时,后续评估将使用存储的部分。使用“on event”,对所有部分进行评估,如果所有部分均为真,则哨兵满意。否则,所有结果都将被丢弃而不存储。" - } - }, - "AUTOCOMPLETEPACKAGE": { - "AUTOCOMPLETEENABLED": { - "TITLE": "自动完成", - "DESCRIPTION": "当所有必需的子级都处于结束状态且没有其他子级处于活动状态时,指示阶段将自动完成的标志。" - }, - "AUTOCOMPLETECONDITION": { - "TITLE": "自动完成条件", - "DESCRIPTION": "如果阶段可以自动完成,则解析为的表达式。" - } - }, - "REQUIREDRULEPACKAGE": { - "REQUIREDENABLED": { - "TITLE": "必须的", - "DESCRIPTION": "指示在确定父阶段完成时是否需要阶段、任务或里程碑的标志。默认为false。" - }, - "REQUIREDRULECONDITION": { - "TITLE": "必需规则", - "DESCRIPTION": "在确定父阶段完成时,决定阶段、任务或里程碑是否需要的表达式。" - } - }, - "REPETITIONRULEPACKAGE": { - "REPETITIONENABLED": { - "TITLE": "重复", - "DESCRIPTION": "指示是否启用重复的标志" - }, - "REPETITIONRULECONDITION": { - "TITLE": "重复规则", - "DESCRIPTION": "用于确定是否需要创建计划的新实例的表达式。" - }, - "REPETITIONCOUNTERVARIABLENAME": { - "TITLE": "重复计数器变量", - "DESCRIPTION": "存储重复实例计数器的局部变量的名称。默认值为“repetitionCounter”。" - } - }, - "MANUALACTIVATIONRULEPACKAGE": { - "MANUALACTIVATIONENABLED": { - "TITLE": "手动激活", - "DESCRIPTION": "指示任务或阶段是否需要手动激活的标志。默认为false。" - }, - "MANUALACTIVATIONRULECONDITION": { - "TITLE": "手动激活规则", - "DESCRIPTION": "一种表达式,用于确定阶段或任务是否需要手动激活。" - } - }, - "COMPLETIONNEUTRALRULEPACKAGE": { - "COMPLETIONNEUTRALENABLED": { - "TITLE": "完成中性", - "DESCRIPTION": "指示计划项是否处于非完成状态的标志。默认为false。" - }, - "COMPLETIONNEUTRALRULECONDITION": { - "TITLE": "完成中性规则", - "DESCRIPTION": "用于确定计划项是否为非完成状态的表达式。" - } - }, - "PLANITEMLIFECYCLELISTENERSPACKAGE": { - "PLANITEMLIFECYCLELISTENERS": { - "TITLE": "生命周期监听器", - "DESCRIPTION": "计划项生命周期事件的监听器" - } - }, - "DISPLAYORDERPACKAGE": { - "DISPLAYORDER": { - "TITLE": "显示顺序", - "DESCRIPTION": "表示获取或显示阶段概述时与其他阶段相比的顺序的数值。" - } - }, - "INCLUDEINSTAGEOVERVIEWPACKAGE": { - "INCLUDEINSTAGEOVERVIEW": { - "TITLE": "包括在概述中", - "DESCRIPTION": "指示是否应为阶段概述考虑此阶段" - } - }, - "MILESTONEVARIABLEPACKAGE" : { - "MILESTONEVARIABLE": { - "TITLE": "Milestone variable", - "DESCRIPTION": "If set, a variable with this name and boolean value true will be created when this milestone is reached" - } - }, - "SCRIPTFORMATPACKAGE": { - "SCRIPTFORMAT": { - "TITLE": "脚本格式", - "DESCRIPTION": "脚本任务的脚本格式(javascript、groovy等)。" - } - }, - "SCRIPTTEXTPACKAGE": { - "SCRIPTTEXT": { - "TITLE": "脚本", - "DESCRIPTION": "脚本任务的脚本文本。" - } - }, - "TRANSITIONEVENTPACKAGE": { - "TRANSITIONEVENT": { - "TITLE": "过渡事件类型", - "DESCRIPTION": "过渡事件类型" - } - }, - "AVAILABLECONDITIONPACKAGE": { - "AVAILABLECONDITION": { - "TITLE": "可用条件", - "DESCRIPTION": "事件监听器上的可选条件表达式,用于指示何时可用。" - } - }, - "SERVICETASKSTORERESULTVARIABLETRANSIENTPACKAGE" : { - "SERVICETASKSTORERESULTVARIABLETRANSIENT" : { - "TITLE" : "使結果變量瞬變", - "DESCRIPTION" : "指示存储結果變量变量瞬态的标志" - } - } - }, - "STENCILS" : { - "GROUPS" : { - "DIAGRAM" : "图解", - "CONTAINERS" : "容器", - "ACTIVITIES" : "活动", - "EVENTLISTENERS" : "事件监听器", - "SENTRIES" : "哨兵", - "CONNECTORS" : "连接器" - }, - "CMMNDIAGRAM" : { - "TITLE" : "CMMN-图", - "DESCRIPTION" : "CMMN 2.0 图表。" - }, - "CASEPLANMODEL" : { - "TITLE" : "案例计划模型", - "DESCRIPTION" : "案例计划模型" - }, - "STAGE" : { - "TITLE" : "阶段", - "DESCRIPTION" : "阶段" - }, - "TASK" : { - "TITLE" : "任务", - "DESCRIPTION" : "手动任务" - }, - "HUMANTASK" : { - "TITLE" : "人工任务", - "DESCRIPTION" : "分配给特定人员的手动任务" - }, - "SERVICETASK" : { - "TITLE" : "服务任务", - "DESCRIPTION" : "具有服务逻辑的自动任务" - }, - "DECISIONTASK" : { - "TITLE" : "决策任务", - "DESCRIPTION" : "调用DMN决策的任务" - }, - "HTTPTASK" : { - "TITLE" : "HTTP任务", - "DESCRIPTION" : "一个HTTP任务" - }, - "SCRIPTTASK" : { - "TITLE" : "脚本任务", - "DESCRIPTION" : "具有脚本逻辑的自动任务" - }, - "MILESTONE" : { - "TITLE" : "里程碑", - "DESCRIPTION" : "里程碑" - }, - "CASETASK" : { - "TITLE" : "案例任务", - "DESCRIPTION" : "引用案例定义以启动新实例" - }, - "PROCESSTASK" : { - "TITLE" : "流程任务", - "DESCRIPTION" : "对流程定义的引用以启动新实例" - }, - "EVENTLISTENER" : { - "TITLE" : "事件监听器", - "DESCRIPTION" : "通用事件监听器" - }, - "TIMEREVENTLISTENER" : { - "TITLE" : "计时器事件监听器", - "DESCRIPTION" : "带有计时器触发器的事件监听器" - }, - "USEREVENTLISTENER" : { - "TITLE" : "用户事件监听器", - "DESCRIPTION" : "用户事件的监听器" - }, - "ENTRYCRITERION" : { - "TITLE" : "进入准则", - "DESCRIPTION" : "定义进入标准的哨兵" - }, - "EXITCRITERION" : { - "TITLE" : "退出准则", - "DESCRIPTION" : "定义出口标准的哨兵" - }, - "ASSOCIATION" : { - "TITLE" : "关联", - "DESCRIPTION" : "将哨兵与计划项目联系起来" - } - } - }, - - "EDITOR": { - "POPUP": { - "UNSAVED-CHANGES": { - "TITLE": "您有未保存的更改", - "DESCRIPTION": "您想如何处理未保存的更改?", - "ACTION": { - "SAVE": "保存更改", - "DISCARD": "放弃更改", - "CONTINUE": "继续编辑" - } - } - } - }, - - "PROCESS-LIST" : { - "TITLE" : "业务流程模型", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建流程", - "IMPORT": "导入流程" - }, - - "FILTER" : { - "PROCESSES": "流程模型", - "PROCESSES-COUNT": "一共有 {{total}}个流程模型", - "PROCESSES-ONE": "有一个流程模型", - "PROCESSES-EMPTY": "目前还没有创建流程模型。您可以设计流程模型、用户表单,然后将它们捆绑到app中。第一步是创建流程模型:", - "PROCESSES-BPMN-HINT": "使用BPMN可视化编辑器创建BPMN模型.", - "PROCESSES-BPMN-IMPORT-HINT": "还可以导入现有的BPMN模型。", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到流程模型 \"{{filterText}}\"", - "RECENT": "最近", - "RECENT-COUNT": "{{total}} 最近使用的模型", - "RECENT-ONE": "最近使用的模型", - "RECENT-EMPTY": "最近没有使用模型" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "CASE-LIST" : { - "TITLE" : "案例模型", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建案例", - "IMPORT": "导入案例" - }, - - "FILTER" : { - "CASES": "案例模型", - "CASES-COUNT": "一共有 {{total}}个案例模型", - "CASES-ONE": "有一个case模型", - "CASES-EMPTY": "目前还没有创建案例模型。您可以设计实例模型、用户表单,然后将它们捆绑到app应用程序定义中。第一步是创建一个案例模型。:", - "CASES-CMMN-HINT": "使用CMMN可视化编辑器创建CMMN模型.", - "CASES-CMMN-IMPORT-HINT": "还可以导入现有CMMN模型。", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到case模型 \"{{filterText}}\"", - "RECENT": "最近", - "RECENT-COUNT": "{{total}} 最近使用的模型", - "RECENT-ONE": "最近使用的模型", - "RECENT-EMPTY": "最近没有使用模型" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "FORMS-LIST" : { - "TITLE" : "表单", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建表单", - "CREATE-INLINE": "现在创建一个新表单!", - "SHOW-MORE": "显示更多..." - }, - - "FILTER" : { - "FORMS": "表单", - "FORMS-COUNT": "一共有{{total}} 个表单", - "FORMS-ONE": "有一个表单", - "FORMS-EMPTY": "没有表单。若要添加一个,请单击创建表单 ", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到表单 \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "DECISIONS-LIST": { - "TITLE": "决策表", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION": { - "CREATE": "创建决策表", - "IMPORT": "导入决策表", - "CREATE-INLINE": "现在创建一个新的决策表!", - "SHOW-MORE": "显示更多..." - }, - - "FILTER": { - "DECISION-TABLES": "决策表", - "DECISION-TABLES-COUNT": "一共有 {{total}} 个决策表", - "DECISION-TABLES-ONE": "有一个决策表", - "DECISION-TABLES-EMPTY": "没有决策表。若要添加一个,请单击创建决策表 ", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到决策表 \"{{filterText}}\"" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - - "APPS-LIST" : { - "TITLE" : "应用程序定义", - "SEARCH-PLACEHOLDER": "搜索", - "ACTION" : { - "CREATE": "创建应用程序", - "IMPORT": "导入应用程序", - "SHOW-MORE": "显示更多..." - }, - - "FILTER" : { - "APPS": "应用程序定义", - "APPS-COUNT": "一共有 {{total}}个应用程序定义", - "APPS-ONE": "有一个app定义", - "APPS-EMPTY": "没有应用程序定义。若要添加一个,请单击创建应用程序定义", - "FILTER-TEXT": ", 匹配 \"{{filterText}}\"", - "FILTER-TEXT-EMPTY": "没有匹配到应用程序定义 \"{{filterText}}\"", - - "NO-APPS": " 您可以通过发布一批流程模型来创建应用程序定义", - "NO-APPS-CALL-TO-ACTION": "现在可以创建一个应用程序定义 ", - "NO-APPS-NOTE": "当你准备好使用它时,记得要发布它。" - }, - - "SORT": { - "MODIFIED-ASC": "按照修改时间升序", - "MODIFIED-DESC": "按照修改时间降序", - "NAME-ASC": "按照名称升序", - "NAME-DESC": "按照名称降序" - } - }, - "PROCESS": { - "NAME": "模型名称", - "KEY": "模型key", - "DESCRIPTION": "描述", - "VERSION-COMMENT": "版本注释", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "DUPLICATE": "复制这个模型", - "EXPORT_BPMN20": "导出到BPMN2", - "DELETE": "删除这个模型", - "CREATE-CONFIRM": "创建新模型", - "DUPLICATE-CONFIRM": "复制这个模型", - "OPEN-IN-EDITOR": "可视化编辑器", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "删除流程模型", - "USE-AS-NEW-VERSION": "作为新版本使用", - "FAVORITE": "喜欢这个模型" - - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建", - "NO-DESCRIPTION": "这个模型没有描述信息,可以通过修改模型来添加一个描述" - }, - - "POPUP": { - "CREATE-TITLE": "创建一个新的业务流程模型", - "DUPLICATE-TITLE": "复制这个业务流程模型", - "CREATE-DESCRIPTION": "您需要为新模型命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您可以更改新模型的名称,并且此时您可以更改描述信息。", - "EDIT-DESCRIPTION": "更改下面的任何模型属性,然后按下保存去更新模型。", - "DELETE-DESCRIPTION": "确实要删除进程模型吗? \"{{name}}\"?", - "EDIT-TITLE":"编辑模型详细信息", - "DELETE-TITLE": "删除模型", - "DELETE-LOADING-RELATIONS": "检查模型使用...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-RELATIONS-DESCRIPTION": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-PROCESS-RELATION": "流程模型", - "DELETE-FORM-RELATION": "表单模型", - "DELETE-APP-RELATION": "App模型", - "IMPORT-DESCRIPTION": "请浏览或拖拽.bpmn或.bpmn20.xml扩展名的BPMN XML定义", - "IMPORT-TITLE": "导入一个流程模型", - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新app模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建", - "SHARED-WITH": "分享", - "PERMISSION": "许可", - "ACTIONS": "动作", - "IMPORT": { - "DROPZONE": "拖拽一个 .bpmn 或者 .bpmn20.xml BPMN XML 文件", - "CANCEL-UPLOAD": "取消上传", - "ERROR": "处理BPMN XML文件时出错", - "NO-DROP": "不支持拖放" - } - }, - "ALERT": { - "EDIT-CONFIRM": "模型被更新" - }, - "ERROR": { - "NOT-FOUND": "所请求的模型不存在" - } - }, - - "SUBPROCESS": { - "NAME": "子流程名称", - "DESCRIPTION": "描述信息", - "ACTION": { - "CREATE-CONFIRM": "创建一个子流程" - }, - "POPUP": { - "CREATE-TITLE": "创建一个新的子流程", - "CREATE-DESCRIPTION": "您需要为新的子流程命名,并且您可能希望同时添加描述。" - } - }, - - "CASE": { - "NAME": "模型名称", - "KEY": "模型key", - "DESCRIPTION": "描述信息", - "VERSION-COMMENT": "版本注释", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "DUPLICATE": "复制这个模型", - "EXPORT_CMMN": "导出到CMMN1.1", - "DELETE": "删除这个模型", - "CREATE-CONFIRM": "创建新模型", - "DUPLICATE-CONFIRM": "复制这个模型", - "OPEN-IN-EDITOR": "可视化编辑器", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "删除case模型", - "USE-AS-NEW-VERSION": "作为新版本使用", - "FAVORITE": "喜欢这个模型" - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "LAST-UPDATED-BY": "最后被 {{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建", - "NO-DESCRIPTION": "这个模型没有描述信息,可以通过修改模型来添加一个描述" - }, - - "POPUP": { - "CREATE-TITLE": "创建一个新的案例模型", - "DUPLICATE-TITLE": "复制这个案例模型", - "CREATE-DESCRIPTION": "您需要为新模型命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您可以更改新模型的名称,并且此时您可以更改描述信息。", - "EDIT-DESCRIPTION": "更改下面的任何模型属性,然后按下保存去更新模型。", - "DELETE-DESCRIPTION": "确实要删除进程流程吗 \"{{name}}\"?", - "EDIT-TITLE":"编辑模型详细信", - "DELETE-TITLE": "删除模型", - "DELETE-LOADING-RELATIONS": "检查模型使用...", - "DELETE-RELATIONS-DESCRIPTION-SINGLE": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-RELATIONS-DESCRIPTION": "无法删除此模型,因为另一个模型正在使用它:", - "DELETE-PROCESS-RELATION": "案例模型", - "DELETE-FORM-RELATION": "表单模型", - "DELETE-APP-RELATION": "应用程序模型", - "IMPORT-DESCRIPTION": "请浏览或拖拽.cmmn 或者.cmmn.xml 扩展名的CMMN XML", - "IMPORT-TITLE": "导入一个案例模型", - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新应用程序模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建", - "SHARED-WITH": "分享", - "PERMISSION": "许可", - "ACTIONS": "动作", - "IMPORT": { - "DROPZONE": "拖拽一个 .cmmn or .cmmn.xml CMMN XML文件", - "CANCEL-UPLOAD": "取消上传", - "ERROR": "处理CMMN XML文件时出错", - "NO-DROP": "不支持拖放" - } - }, - "ALERT": { - "EDIT-CONFIRM": "模型被更新" - }, - "ERROR": { - "NOT-FOUND": "所请求的模型不存在" - } - }, - - "FORM": { - "NAME": "表单名称", - "KEY": "表单key", - "DESCRIPTION": "描述", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "DELETE": "复制这个表单", - "CREATE-CONFIRM": "创建新表单", - "DUPLICATE": "复制这个表单", - "DUPLICATE-CONFIRM": "复制这个表单", - "OPEN-IN-EDITOR": "表单编辑器", - "EDIT-CONFIRM": "保存", - "DELETE-CONFIRM": "删除表单", - "USE-AS-NEW-VERSION": "作为新版本使用" - - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建" - }, - - "POPUP": { - "CREATE-TITLE": "创建一个新的表单", - "DUPLICATE-TITLE": "复制这个表单", - "CREATE-DESCRIPTION": "您需要为新表单命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您需要为新表单命名,并且您可以在这个操作中添加描述信息。", - "SAVE-FORM-TITLE": "保存表单", - "EDIT-DESCRIPTION": "更改下面的任何模型属性,然后按下保存去更新表单。", - "DELETE-DESCRIPTION": "确实要删除表单 \"{{name}}\"?", - "EDIT-TITLE":"编辑表单详细信息", - "DELETE-TITLE": "删除表单", - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-VERSION": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新app模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建" - } - }, - - "DECISION-TABLE": { - "NAME": "决策表 名称", - "KEY": "决策表 key", - "DESCRIPTION": "描述", - "VERSION-COMMENT": "版本注释", - "HIT-POLICY": "命中策略:", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改模型属性", - "SHARE": "分享决策表", - "DELETE": "删除决策表", - "ADD-COMMENT": "+ 添加评论", - "CREATE-CONFIRM": "创建新的决策表", - "OPEN-IN-EDITOR": "决策表编辑器", - "EXPORT": "Export 决策表", - "DELETE-CONFIRM": "删除决策表", - "USE-AS-NEW-VERSION": "作为新版本使用", - "FAVORITE": "喜欢这个决策表", - "DUPLICATE": "复制这个决策表" - }, - "DETAILS": { - "HISTORY-TITLE": "历史", - "COMMENTS-TITLE": "评论", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建" - }, - "HIT-POLICIES": { - "FIRST": "第一个", - "ANY": "任何", - "UNIQUE": "唯一", - "PRIORITY": "优先级", - "RULE ORDER": "规则顺序", - "OUTPUT ORDER": "输出顺序", - "COLLECT": "采集" - }, - "COLLECT-OPERATORS": { - "SUM": "和", - "MIN": "最小", - "MAX": "最大", - "COUNT": "总数" - }, - "POPUP": { - "CREATE-TITLE": "创建一个新的决策表", - "CREATE-DESCRIPTION": "您需要为新决策表命名,并且您可以在这个操作中添加描述信息。", - "SAVE-DESCRIPTION": "您可以更改新决策表的名称,并且此时您可以更改描述信息。", - "DUPLICATE-TITLE": "复制决策表", - "DUPLICATE-DESCRIPTION": "您需要为新决策表命名,并且您可以在这个操作中添加描述信息。", - "DELETE-TITLE": "删除决策表", - "DELETE-DESCRIPTION": "确实要删除决策表 \"{{name}}\"?", - "SAVE-DECISION-TABLE-TITLE": "保存决策表", - "IMPORT-DESCRIPTION": "请浏览或拖拽.dmn or .dmn.xml扩展名的的 DMN XML文件", - "IMPORT-TITLE": "导入DMN模型", - "IMPORT": { - "DROPZONE": "拖拽一个 .dmn or .dmn.xml DMN XML文件", - "CANCEL-UPLOAD": "取消上传", - "ERROR": "处理DMN XML文件时出错", - "NO-DROP": "不支持拖放" - }, - "USE-AS-NEW-TITLE": "作为一个新版本使用", - "USE-AS-NEW-VERSION": "作为一个新版本使用", - "USE-AS-NEW-DESCRIPTION": "您确定要使用 {{version}}版本 去创建一个关于 \"{{name}}\"的新版本?", - "USE-AS-NEW-UNRESOLVED-MODELS-ERROR": "无法完全恢复app模型到所选择的版本:由于一些引用的模型过去被删除而丢失。请相应地更新app模型。缺失模型:", - "USE-AS-NEW-UNRESOLVED-MODEL": "模型 '{{name}}' 内部id {{id}}, 被 {{createdBy}}创建" - }, - "ALERT": { - "FAVORITE-CONFIRM": "喜欢这个决策表", - "UN-FAVORITE-CONFIRM": "这个决策表不再流行了" - } - }, - - "APP": { - "NAME": "应用程序定义名称", - "KEY": "应用程序定义key", - "DESCRIPTION": "描述", - "ICON": "图标", - "THEME": "主题", - "GROUPS-ACCESS": "组访问,用逗号分隔", - "USERS-ACCESS": "用户访问,用逗号分隔", - "ACTION": { - "DETAILS": "显示详细信息", - "EDIT": "修改应用程序定义属性", - "DUPLICATE": "复制这个应用", - "SHARE": "分享应用程序定义", - "DELETE": "删除应用程序定义", - "CREATE-CONFIRM": "创建新的应用程序定义", - "DUPLICATE-CONFIRM": "复制这个应用程序定义", - "DELETE-CONFIRM": "删除应用程序定义", - "USE-AS-NEW-VERSION": "作为新版本使用", - "OPEN-IN-EDITOR": "应用程序编辑器", - "PUBLISH": "发布", - "PUBLISH-CONFIRM": "发布应用程序定义", - "SELECT-ICON": "修改图标...", - "SELECT-THEME": "修改主题...", - "EDIT-MODELS": "编辑包含的模型", - "EXPORT-ZIP": "将app定义导出为zip文件", - "EXPORT-BAR": "将app定义导出为可部署的bar文件" - - }, - "DETAILS": { - "TITLE": "App定义详细信息: {{name}}", - "HISTORY-TITLE": "历史", - "MODELS-TITLE": "app定义中包含的模型", - "LAST-UPDATED-BY": "最后被{{lastUpdatedBy}} - {{lastUpdated | dateformat}}更新", - "CREATED-BY": "被{{createdBy}}创建", - "NO-DESCRIPTION": "这个应用程序定义没有描述信息,可以通过修改应用程序定义来添加一个描述", - "NO-MODELS-SELECTED": "没有为这个应用程序选择模型" - }, - "TITLE": { - "SELECT-ICON": "选择应用图标", - "SELECT-THEME": "选择应用主题", - "PREVIEW": "预览" - - }, - "POPUP": { - "CREATE-TITLE": "创建新的应用程序定义", - "DUPLICATE-TITLE": "复制一个应用程序定义", - "SAVE-APP-TITLE": "保存应用程序定义", - "SAVE-APP-SAVE-SUCCESS": "保存的应用程序定义", - "CREATE-DESCRIPTION": "您需要为新的应用程序定义命名,并且您可以在这个操作中添加描述信息。", - "DUPLICATE-DESCRIPTION": "您需要为新的应用程序定义命名,并且您可以在这个操作中添加描述信息。", - "PUBLISH-TITLE": "发布应用程序定义", - "PUBLISH-DESCRIPTION": "您确定要发布应用程序定义 \"{{name}}\"? 注意这个应用程序定义将版本化,如果已经存在,则将更新工作流应用程序。", - "PUBLISH-FIELD": "发布?请注意,如果启用了发布,则将版本化此应用程序定义,如果已经存在,则将更新工作流应用程序。", - "PUBLISH-ERROR-PROCDEF-KEY-CONFLICT": "你的流程模型 \"{{modelInAppName}}\"具有相同的标识符\"{{processDefinitionKey}}\"作为已经存在的部署流程\"{{conflictingModelName}}\" ,关于这个应用程序 \"{{conflictingAppName}}\". 请修改这个 \"id\"流程模型的属性。", - "PUBLISH-ERROR-PROCESS-ALREADY-USED": "下面的流程模型已经在另一个应用程序中使用了。这样行吗?", - "PUBLISH-ERROR-PROCESS-ALREADY-USED-APP": "应用程序", - "PUBLISH-ERROR-PROCDEF-DUPLICATE-KEYS": "无效的应用程序: 找到重复的流程标识符 (修改这个非法的流程模型 \"id\"属性):", - "DELETE-TITLE": "删除应用程序定义", - "DELETE-DESCRIPTION": "确实要删除应用程序定义 \"{{name}}\"?", - "DELETE-DESCRIPTION-WITH-RUNTIME": "确实要删应用程序定义 \"{{name}}\"? 注意,这个应用程序定义已经部署到任务landing页面,并且通过确认,该应用程序将从任务应用程序landing页面中删除。", - "DELETE-CASCADE-FALSE": "只删除当前版本的应用程序定义 (v{{version}})", - "DELETE-CASCADE-TRUE": "也删除所有以前的版本应用程序定义", - "HAS-CUSTOM-STENCILITEM" : "模型 \"{{modelName}}\" 使用带有自定义模板项目的模板. 在这个模型中使用这个模型是不可能的.", - "HAS-VALIDATIONERROR" : "模型 \"{{modelName}}\" 有验证错误,不能添加到应用程序定义.在编辑器中打开模型以查看关于验证错误的更多细节。", - "IMPORT-DESCRIPTION":"请使用.zip扩展的应用程序定义浏览或拖拽一个", - "IMPORT-TITLE":"导入应用程序定义模型", - "IMPORT": { - "DROPZONE": "扩拽一个.zip 应用程序定义文件", - "CANCEL-UPLOAD": "取消上传", - "RENEWIDM-IDS": "Renew the user and group identifiers when importing step and BPMN models. This is often required when importing the 应用程序定义 into a different Flowable environment. It will try to link the human steps and user tasks to the right user and group in this target environment.", - "ERROR": "处理应用程序定义文件时出错", - "NO-DROP": "不支持拖放" - }, - "INCLUDE-MODELS-TITLE": "包含在应用程序定义中的模型" - }, - "ALERT": { - "DELETE-CONFIRM": "应用程序定义删除了", - "PUBLISH-CONFIRM": "应用程序定义已经被发布了", - "PUBLISH-ERROR": "不能发布应用程序定义. 请检查引用的流程模型的有效性。" - } - }, - - "SHARE-INFO": { - "ACTION": { - "ADD": "添加另一个人" - } - }, - - "FORM-BUILDER": { - "PALLETTE": { - "TEXT": "文本", - "MULTILINE-TEXT": "多行文本", - "PASSWORD": "密码", - "NUMBER": "数字", - "CHECKBOX": "多选", - "DATE": "日期", - "DROPDOWN": "下拉", - "RADIO": "单选按钮", - "PEOPLE": "选择人", - "GROUP-OF-PEOPLE": "选择组", - "UPLOAD": "上传文件", - "EXPRESSION": "表达式", - "DECIMAL": "小数", - "HYPERLINK": "超链接", - "SPACER": "垫片", - "HORIZONTAL-LINE": "横线", - "HEADLINE": "标题", - "HEADLINE-WITH-LINE":"标题和线" - }, - "TABS": { - "GENERAL": "一般", - "OPTIONS": "选项", - "UPLOAD-OPTIONS": "上传选项", - "ADVANCED-OPTIONS":"高级" - }, - "VERSION": "版本 {{version}}", - "LAST-UPDATED": "最后更新的 {{lastUpdatedBy}}, {{lastUpdated | dateformat}}", - "TITLE": { - "DESIGN": "设计", - "OUTCOME": "结果" - }, - "POPUP": { - "EDIT-TITLE": "编辑字段 '{{name}}'", - "EXPRESSION-TITLE": "编辑表达式" - }, - "MESSAGE": { - "EMPTY-EXPRESSION": "(没有表达值)", - "EXPRESSION-HELP": "您还可以使用如下的符号来引用先前以任何形式提交的值,作为文本的一部分 ${myFieldId}.", - "OPTIONS-EXPRESSION-HELP": "可以使用表达式来动态填充选项,例如通过引用这样的变量 ${optionsVariable}. 这个表达式需要产生一个java对象(java.util)。带有选项对象的列表)或其json表示。" - }, - "LABEL" : { - "FUNCTIONAL-GROUP": "选择组..", - "PERSON": "选择人.." - }, - "COMPONENT": { - "LABEL": "标签:", - "OVERRIDEID": "覆盖id?", - "ID": "Id:", - "PLACEHOLDER": "默认值:", - "OPTIONS": "选项", - "RADIO-BUTTON-DEFAULT": "选项 1", - "DROPDOWN-DEFAULT-EMPTY-SELECTION": "请选择一个...", - "DROPDOWN-EMPTY-VALUE-HELP": " 这是‘空值’选项。在运行时选择它意味着‘没有值’或’空’。这允许用于可选字段,但不允许用于必需字段。", - "OPTIONS-EXPRESSION": "选择表达:", - "OPTIONS-EXPRESSION-ENABLED": "启用选项表达", - "REQUIRED": "必填", - "READONLY": "只读", - "EXPRESSION": "表达式", - "ADD-OPTION": "+ 添加一个新选项", - "UPLOAD-ALLOW-MULTIPLE": "允许上传多个文件", - "SIZE": "大小", - "MAX-LENGTH":"最大长度:", - "MIN-LENGTH":"最小长度:", - "PASSWORD-UNMASK-OPTION": "密码屏蔽/揭露选项", - "HYPERLINK-URL": "超链接地址", - "REGEX-PATTERN":"正则表达式的标准", - "MASK":{ - "TITLE":"输入掩码", - "EXAMPLES":{ - "TITLE":"例子:", - "NUMBER":"任何数字", - "LETTER":"任何字母", - "NUMBERORLETTER":"任何字母或数字", - "OPTIONAL":"使蒙版可选(无效)", - "PHONE":"电话" - } - } - }, - "OUTCOMES": { - "DESCRIPTION": "您可以为这个任务定义多个结果。在完成一个任务时,用户选择一个可用的结果,可在后续的流程中使用结果变量", - "NO-OUTCOMES-OPTION": "不要使用自定义结果,只显示'完成'按钮。", - "OUTCOMES-OPTION": "使用此表单的定制结果。", - "POSSIBLE-OUTCOMES": "可能的结果", - "NEW-OUTCOME-PLACEHOLDER": "输入新的结果", - "ADD": "添加结果", - "REMOVE": "移除" - } - }, - - "DECISION-TABLE-EDITOR": { - "EMPTY-MESSAGES": { - "NO-VARIABLE-SELECTED": "未定义" - }, - "POPUP": { - "EXPRESSION-EDITOR": { - "INPUT-TITLE": "编辑输入列", - "INPUT-DESCRIPTION": "选择输入变量作为列的输入", - "OUTPUT-TITLE": "编辑输出列", - "OUTPUT-DESCRIPTION": "选择一个现有的输出变量或创建一个新的变量", - "EXPRESSION-LABEL": "列标签:", - "EXPRESSION-PLACEHOLDER": "输入可选标签", - "EXPRESSION-VARIABLE-NAME": "变量名称:", - "EXPRESSION-VARIABLE-TYPE": "变量类型:", - "EXPRESSION-VARIABLE-NAME-PLACEHOLDER": "输入变量名", - "OUTPUT-NEW-VARIABLE-ID": "变量ID:", - "OUTPUT-NEW-VARIABLE-TYPE": "变量类型:", - "COMPLEX-EXPRESSION-LABEL": "复杂表达式:", - "ALLOWED-VALUES": "允许值(可选):", - "OUTPUT-VALUES": "输出值", - "OUTPUT-VALUES-OPTIONAL": "(可选):", - "OUTPUT-VALUES-NOT-OPTIONAL": "(为优先级/输出顺序拖动行):" - } - }, - "BUTTON-ACTIONS-LABEL": "动作", - "BUTTON-ADD-INPUT-LABEL": "添加输入", - "BUTTON-ADD-OUTPUT-LABEL": "添加输出", - "BUTTON-ADD-RULE-LABEL": "添加规则", - "BUTTON-MOVE-RULE-UPWARDS-LABEL": "向上移动", - "BUTTON-MOVE-RULE-DOWNWARDS-LABEL": "向下移动", - "BUTTON-REMOVE-RULE-LABEL": "移除规则", - "ALERT": { - "EXPRESSION-VARIABLE-REQUIRED-ERROR": "所有输入和输出表达式都必须引用表单字段或变量。", - "SAVE-CONFIRM": "保存决策表'{{name}}'" - } - }, - - "TOUR": { - "WELCOME-TITLE": "欢迎, {{userName}}", - "WELCOME-CONTENT": "这是一个短暂的flowable编辑器. 接下来的几个步骤将指导您通过应用程序的不同部分来启动。按ESC键随时停止。" , - "PALETTE-TITLE": "调色板", - "PALETTE-CONTENT": "在这里可以找到创建业务流程的所有可用构成。它们是按逻辑组排列的。只需点击它就可以打开一组:", - "CANVAS-TITLE": "画布", - "CANVAS-CONTENT": "这是创建业务流程的工作空间。从左侧的调色板中拖动元素,并将它们放在画布上以开始建模", - "DRAGDROP-TITLE": "拖放示例", - "DRAGDROP-CONTENT": "下面是一个如何开始建模的例子:", - "PROPERTIES-TITLE": "属性", - "PROPERTIES-CONTENT": "在这里您可以配置业务流程构造的属性。只需选择画布上的项目,它的属性就会显示出来。如果要编辑该属性,请单击该属性。", - "TOOLBAR-TITLE": "工具栏", - "TOOLBAR-CONTENT": "可以在这里找到所有的动作:保存或验证模型, 复制和粘贴一个流程的部分, 等等. 在按钮上悬停以此获得对动作的描述信息.", - "END-TITLE": "终点", - "END-CONTENT": "就是这样!现在可以开始建模过程。如果你有任何问题,可以问他们。 Flowable论坛 " - }, - - "FEATURE-TOUR" : { - "BENDPOINT" : { - "TITLE": "教程", - "DESCRIPTION" : "当使用连线流将流程按照步骤彼此连接的时候,您可能会发现,这些连线彼此交叉,或者您希望以不同的方式排列它们。这样做, 可以向连线添加或移除一个弯曲点。

如下图所示,你首先应该点击 '添加弯曲点' 然后单击连线添加它。注意,连线将在绿色中显示一个微妙的指示,以显示可以在那里添加弯曲点。

删除一个弯曲点再次遵循类似的模式: 点击 '移除弯曲点' 按钮 ,然后点击弯曲点再次移除。" - } - }, - - "ACTION.OK" : "Ok", - "ACTION.SAVE" : "保存", - "ACTION.SAVE-AND-CLOSE" : "保存和关闭编辑器", - "ACTION.SEND" : "发送", - "ACTION.CANCEL" : "取消", - "ACTION.SELECT" : "选择", - "ACTION.ADD" : "添加", - "ACTION.REMOVE" : "移除", - "ACTION.MOVE.UP" : "移动入口", - "ACTION.MOVE.DOWN" : "向下移动", - - "TOOLBAR.ACTION.CLOSE" : "关闭编辑器并返回到概览页面", - "TOOLBAR.ACTION.SAVE" : "保存模型", - "TOOLBAR.ACTION.VALIDATE" : "验证模型", - "TOOLBAR.ACTION.CUT" : "剪切 (在业务流程中选择一个或多个元素)", - "TOOLBAR.ACTION.COPY" : "拷贝 (在业务流程中选择一个或多个元素)", - "TOOLBAR.ACTION.PASTE" : "粘贴", - "TOOLBAR.ACTION.DELETE" : "删除选定元素", - "TOOLBAR.ACTION.UNDO" : "撤消", - "TOOLBAR.ACTION.REDO" : "重做", - "TOOLBAR.ACTION.ZOOMIN" : "放大", - "TOOLBAR.ACTION.ZOOMOUT" : "缩小", - "TOOLBAR.ACTION.ZOOMACTUAL" : "缩放到实际尺寸", - "TOOLBAR.ACTION.ZOOMFIT" : "缩放到适当大小", - "TOOLBAR.ACTION.BENDPOINT.ADD" : "向选定的连线添加弯曲点", - "TOOLBAR.ACTION.BENDPOINT.REMOVE" : "向选定的连线移除弯曲点", - "TOOLBAR.ACTION.ALIGNHORIZONTAL" : "水平对齐", - "TOOLBAR.ACTION.ALIGNVERTICAL" : "垂直对齐", - "TOOLBAR.ACTION.SAMESIZE" : "相同大小", - "TOOLBAR.ACTION.HELP": "开始导游", - "TOOLBAR.ACTION.FEEDBACK": "提供反馈", - - "FORM_TOOLBAR.ACTION.SAVE" : "保存模型", - - "APP_DEFINITION_TOOLBAR.ACTION.SAVE" : "保存应用程序定义", - - "BUTTON.ACTION.DELETE.TOOLTIP": "从模型中删除元素", - "BUTTON.ACTION.MORPH.TOOLTIP": "更改元素类型", - - "ELEMENT.AUTHOR" : "作者", - "ELEMENT.DATE_CREATED" : "创建日期", - - "PROPERTY.REMOVED" : "移除", - "PROPERTY.EMPTY" : "空值", - "PROPERTY.PROPERTY.EDIT.TITLE" : "更改值为", - - "PROPERTY.FEEDBACK.TITLE" : "请填写您的反馈意见", - - "PROPERTY.ASSIGNMENT.TITLE" : "分配", - "PROPERTY.ASSIGNMENT.TYPE" : "类型", - "PROPERTY.ASSIGNMENT.TYPE.IDENTITYSTORE" : "身份存储", - "PROPERTY.ASSIGNMENT.TYPE.STATIC" : "固定值", - "PROPERTY.ASSIGNMENT.ASSIGNEE" : "分配", - "PROPERTY.ASSIGNMENT.MATCHING" : "使用 ↑ 和 ↓选择并按Enter确认或使用鼠标", - "PROPERTY.ASSIGNMENT.ASSIGNEE_PLACEHOLDER" : "输入分配人", - "PROPERTY.ASSIGNMENT.EMPTY" : "没有选择分配人", - "PROPERTY.ASSIGNMENT.NONE" : "未分配经办人", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHUSER": "搜索用户", - "PROPERTY.ASSIGNMENT.PLACEHOLDER-SEARCHGROUP": "搜索组", - "PROPERTY.ASSIGNMENT.SEARCH": "搜索: ", - "PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY" : "分配人 {{assignee}}", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY" : "{{length}} 候选用户", - "PROPERTY.ASSIGNMENT.CANDIDATE_USERS" : "候选用户", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY" : "{{length}} 候选组", - "PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS" : "候选组", - "PROPERTY.ASSIGNMENT.USER_IDM_DISPLAY": "用户 {{firstName}} {{lastName}}", - "PROPERTY.ASSIGNMENT.USER_IDM_EMAIL_DISPLAY": "用户 {{email}}", - "PROPERTY.ASSIGNMENT.USER_IDM_FIELD_DISPLAY": "字段 {{name}}", - "PROPERTY.ASSIGNMENT.IDM_EMPTY" : "流程发起人", - "PROPERTY.ASSIGNMENT.IDM.TYPE" : "分配", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_USERS" : "没有选择候选人...", - "PROPERTY.ASSIGNMENT.IDM.NO_CANDIDATE_GROUPS" : "没有选择候选组...", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.INITIATOR" : "分配给流程发起人", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USER" : "分配给单个用户", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.USERS" : "候选用户", - "PROPERTY.ASSIGNMENT.IDM.DROPDOWN.GROUPS" : "候选组", - "PROPERTY.ASSIGNMENT.INITIATOR-CAN-COMPLETE" : "允许流程发起人完成任务", - "PROPERTY.EXECUTIONLISTENERS.DISPLAY" : "{{length}} 执行监听器", - "PROPERTY.EXECUTIONLISTENERS.EMPTY" : "没有配置执行监听器", - "PROPERTY.EXECUTIONLISTENERS.EVENT" : "事件", - "PROPERTY.EXECUTIONLISTENERS.CLASS" : "类", - "PROPERTY.EXECUTIONLISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION" : "表达式", - "PROPERTY.EXECUTIONLISTENERS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.EXECUTIONLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.EXECUTIONLISTENERS.UNSELECTED" : "没有选择执行监听器", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME" : "名称", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE" : "字符串值", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符串值", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING" : "字符串", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.STRING.PLACEHOLDER" : "输入一个字符串", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.IMPLEMENTATION" : "实现", - "PROPERTY.EXECUTIONLISTENERS.FIELDS.EMPTY" : "未选择字段", - - "PROPERTY.FIELDS" : "{{length}} 字段", - "PROPERTY.FIELDS.EMPTY" : "未选择字段", - "PROPERTY.FIELDS.NAME" : "名称", - "PROPERTY.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.FIELDS.STRINGVALUE" : "字符串值", - "PROPERTY.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符串值", - "PROPERTY.FIELDS.STRING" : "字符串", - "PROPERTY.FIELDS.STRING.PLACEHOLDER" : "输入一个字符串", - "PROPERTY.FIELDS.IMPLEMENTATION" : "实现", - - "PROPERTY.DATAPROPERTIES.VALUES" : "{{length}} 数据对象", - "PROPERTY.DATAPROPERTIES.EMPTY" : "没有配置数据对象", - "PROPERTY.DATAPROPERTIES.ID" : "Id", - "PROPERTY.DATAPROPERTIES.ID.PLACEHOLDER" : "输入一个id", - "PROPERTY.DATAPROPERTIES.NAME" : "名称", - "PROPERTY.DATAPROPERTIES.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.DATAPROPERTIES.TYPE" : "类型", - "PROPERTY.DATAPROPERTIES.VALUE.PLACEHOLDER" : "输入一个值 (可选)", - "PROPERTY.DATAPROPERTIES.VALUE" : "默认值", - - "PROPERTY.FORMPROPERTIES.VALUE" : "{{length}} 表单属性", - "PROPERTY.FORMPROPERTIES.EMPTY" : "没有选择表单属性", - "PROPERTY.FORMPROPERTIES.ID" : "Id", - "PROPERTY.FORMPROPERTIES.ID.PLACEHOLDER" : "输入一个id", - "PROPERTY.FORMPROPERTIES.NAME" : "名称", - "PROPERTY.FORMPROPERTIES.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.FORMPROPERTIES.TYPE" : "类型", - "PROPERTY.FORMPROPERTIES.DATEPATTERN" : "日期格式", - "PROPERTY.FORMPROPERTIES.DATEPATTERN.PLACEHOLDER" : "输入日期格式", - "PROPERTY.FORMPROPERTIES.VALUES" : "值", - "PROPERTY.FORMPROPERTIES.ENUMVALUES.EMPTY" : "未选择枚举值", - "PROPERTY.FORMPROPERTIES.VALUES.ID" : "Id", - "PROPERTY.FORMPROPERTIES.VALUES.NAME" : "名称", - "PROPERTY.FORMPROPERTIES.VALUES.ID.PLACEHOLDER" : "输入id值", - "PROPERTY.FORMPROPERTIES.VALUES.NAME.PLACEHOLDER" : "输入名称值", - "PROPERTY.FORMPROPERTIES.EXPRESSION" : "表达式", - "PROPERTY.FORMPROPERTIES.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.FORMPROPERTIES.VARIABLE" : "变量", - "PROPERTY.FORMPROPERTIES.VARIABLE.PLACEHOLDER" : "输入一个变量", - "PROPERTY.FORMPROPERTIES.DEFAULT" : "默认值", - "PROPERTY.FORMPROPERTIES.DEFAULT.PLACEHOLDER" : "输入一个默认值", - "PROPERTY.FORMPROPERTIES.REQUIRED" : "必须的", - "PROPERTY.FORMPROPERTIES.READABLE" : "可读的", - "PROPERTY.FORMPROPERTIES.WRITABLE" : "可写的", - - "PROPERTY.INPARAMETERS.VALUE" : "{{length}}个输入参数", - "PROPERTY.INPARAMETERS.EMPTY" : "没有配置输入参数", - - "PROPERTY.OUTPARAMETERS.VALUE" : "{{length}}个输出参数", - "PROPERTY.OUTPARAMETERS.EMPTY" : "没有配置输出参数", - - "PROPERTY.PARAMETER.SOURCE" : "源", - "PROPERTY.PARAMETER.SOURCE.PLACEHOLDER" : "输入一个源", - "PROPERTY.PARAMETER.SOURCEEXPRESSION" : "源表达式", - "PROPERTY.PARAMETER.SOURCEEXPRESSION.PLACEHOLDER" : "输入一个源表达式", - "PROPERTY.PARAMETER.TARGET" : "目标", - "PROPERTY.PARAMETER.TARGET.PLACEHOLDER" : "输入一个目标", - "PROPERTY.PARAMETER.TARGETEXPRESSION" : "目标表达式", - "PROPERTY.PARAMETER.TARGETEXPRESSION.PLACEHOLDER" : "输入一个目标表达式", - "PROPERTY.PARAMETER.EMPTY" : "没有选择参数", - - "PROPERTY.PROCESSREFERENCE.EMPTY" : "没有选择引用", - "PROPERTY.PROCESSREFERENCE.TITLE" : "流程参考", - "PROPERTY.PROCESSREFERENCE.ERROR.PROCESS" : "加载流程出错。稍后再试一次", - "PROPERTY.PROCESSREFERENCE.PROCESS.LOADING" : "加载流程...", - "PROPERTY.PROCESSREFERENCE.PROCESS.EMPTY" : "此文件夹不包含流程", - - "PROPERTY.FORMREFERENCE.EMPTY" : "没有选择参考", - "PROPERTY.FORMREFERENCE.TITLE" : "表单引用", - "PROPERTY.FORMREFERENCE.DESCRIPTION" : "引用表单", - "PROPERTY.FORMREFERENCE.ERROR.FORM" : "加载表单出错。稍后再试一次", - "PROPERTY.FORMREFERENCE.FORM.LOADING" : "加载表单...", - "PROPERTY.FORMREFERENCE.FORM.EMPTY" : "此文件夹不包含表单", - - "PROPERTY.TASKLISTENERS.VALUE" : "{{length}}任务监听器", - "PROPERTY.TASKLISTENERS.EMPTY" : "没有配置任务监听器", - "PROPERTY.TASKLISTENERS.EVENT" : "事件", - "PROPERTY.TASKLISTENERS.CLASS" : "类", - "PROPERTY.TASKLISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.TASKLISTENERS.EXPRESSION" : "表达式", - "PROPERTY.TASKLISTENERS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.TASKLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.TASKLISTENERS.UNSELECTED" : "没有选择任务监听器", - "PROPERTY.TASKLISTENERS.FIELDS.NAME" : "名称", - "PROPERTY.TASKLISTENERS.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.TASKLISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE" : "字符串值", - "PROPERTY.TASKLISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符串值", - "PROPERTY.TASKLISTENERS.FIELDS.STRING" : "字符串", - "PROPERTY.TASKLISTENERS.FIELDS.STRING.PLACEHOLDER" : "输入一个字符串", - "PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION" : "实现", - "PROPERTY.TASKLISTENERS.FIELDS.EMPTY" : "没有选择字段", - - "PROPERTY.EVENTLISTENERS.DISPLAY" : "{{length}} 事件监听器", - "PROPERTY.EVENTLISTENERS.EMPTY" : "没有配置事件监听器", - "PROPERTY.EVENTLISTENERS.EVENTS": "事件", - "PROPERTY.EVENTLISTENERS.RETHROW": "Rethrow event?", - "PROPERTY.EVENTLISTENERS.CLASS" : "类", - "PROPERTY.EVENTLISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.EVENTLISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE" : "实体类型", - "PROPERTY.EVENTLISTENERS.ENTITYTYPE.PLACEHOLDER" : "输入一个实体类型", - "PROPERTY.EVENTLISTENERS.RETHROWTYPE": "Rethrow event type", - "PROPERTY.EVENTLISTENERS.ERRORCODE" : "错误码", - "PROPERTY.EVENTLISTENERS.ERRORCODE.PLACEHOLDER" : "输入一个错误码", - "PROPERTY.EVENTLISTENERS.MESSAGENAME" : "消息名称", - "PROPERTY.EVENTLISTENERS.MESSAGENAME.PLACEHOLDER" : "输入一个消息名称", - "PROPERTY.EVENTLISTENERS.SIGNALNAME" : "信号名称", - "PROPERTY.EVENTLISTENERS.SIGNALNAME.PLACEHOLDER" : "输入信号名称", - "PROPERTY.EVENTLISTENERS.UNSELECTED" : "没有选择事件监听器", - - "PROPERTY.PLANITEMLIFECYCLELISTENERS.VALUE" : "{{length}}个生命周期侦听器", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EMPTY" : "未配置生命周期侦听器", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EVENT" : "事件", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.SOURCE_STATE" : "源状态", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.TARGET_STATE" : "目标状态", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS" : "类", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.CLASS.PLACEHOLDER" : "输入一个类名", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION" : "表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION" : "委托表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.DELEGATEEXPRESSION.PLACEHOLDER" : "输入一个委托表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.UNSELECTED" : "未选择任务监听器", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME" : "名称", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.NAME.PLACEHOLDER" : "输入一个名称", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION" : "表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EXPRESSION.PLACEHOLDER" : "输入一个表达式", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE" : "字符值", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRINGVALUE.PLACEHOLDER" : "输入一个字符值", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING" : "字符", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.STRING.PLACEHOLDER" : "输入一个字符值", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.IMPLEMENTATION" : "实现", - "PROPERTY.PLANITEMLIFECYCLELISTENERS.FIELDS.EMPTY" : "没有选中字段", - - "PROPERTY.SIGNALDEFINITIONS.DISPLAY" : "{{length}} 信号定义", - "PROPERTY.SIGNALDEFINITIONS.EMPTY" : "没有配置信号定义", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-GLOBAL": "全局", - "PROPERTY.SIGNALDEFINITIONS.SCOPE-PROCESSINSTANCE": "流程实例", - "PROPERTY.SIGNALDEFINITIONS.ID" : "Id", - "PROPERTY.SIGNALDEFINITIONS.NAME" : "名称", - "PROPERTY.SIGNALDEFINITIONS.SCOPE" : "Scope", - - "PROPERTY.MESSAGEDEFINITIONS.DISPLAY" : "{{length}} 消息定义", - "PROPERTY.MESSAGEDEFINITIONS.EMPTY" : "没有配置消息定义", - "PROPERTY.MESSAGEDEFINITIONS.ID" : "Id", - "PROPERTY.MESSAGEDEFINITIONS.NAME" : "名称", - - "PROPERTY.ESCALATIONDEFINITIONS.DISPLAY" : "{{length}} 个升级定义", - "PROPERTY.ESCALATIONDEFINITIONS.EMPTY" : "没有配置升级定义", - "PROPERTY.ESCALATIONDEFINITIONS.ID" : "Id", - "PROPERTY.ESCALATIONDEFINITIONS.NAME" : "名称", - - "PROPERTY.SEQUENCEFLOW.ORDER.EMPTY" : "没有确定连线的顺序", - "PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY" : "设置连线的顺序", - "PROPERTY.SEQUENCEFLOW.ORDER.NO.OUTGOING.SEQUENCEFLOW.FOUND" : "没有发现流出连线.", - "PROPERTY.SEQUENCEFLOW.ORDER.DESCRIPTION" : "设置需要评估连线的顺序:", - "PROPERTY.SEQUENCEFLOW.ORDER.SEQUENCEFLOW.VALUE" : "连线到 {{targetType}} {{targetTitle}}", - - "PROPERTY.SEQUENCEFLOW.CONDITION.TITLE" : "连线条件", - "PROPERTY.SEQUENCEFLOW.CONDITION.STATIC" : "条件表达式", - "PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY": "没有设置条件", - - "PROPERTY.DUEDATE.EMPTY" : "没有到期", - "PROPERTY.DUEDATE.DEFINED" : "定义到期日", - "PROPERTY.DUEDATE.TITLE" : "到期日", - "PROPERTY.DUEDATE.EXPRESSION-LABEL" : "到期日表达式", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.NO-DUEDATE" : "没有到期日", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.EXPRESSION" : "表达式定义", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.STATIC" : "任务创建后的固定持续时间", - "PROPERTY.DUEDATE.TASK-DUE-DATE-OPTIONS.FIELD" : "基于字段", - - "MODEL.SAVE.TITLE" : "保存模型", - "MODEL.VALIDATE.TITLE" : "验证结果", - "MODEL.NAME" : "名称", - "MODEL.KEY" : "Key", - "MODEL.DESCRIPTION" : "描述", - "MODEL.SAVE.NEWVERSION" : "将此保存为新版本?这意味着你可以回到以前的版本。", - "MODEL.SAVE.COMMENT" : "评论", - "MODEL.SAVE.SAVING" : "正在保存模型", - "MODEL.LASTMODIFIEDDATE" : "最后保存", - "MODEL.SAVE.ERROR": "Unexpected error: 不能保存模型", - "MODEL.VALIDATIONERRORS": " 注意,模型包含验证错误。这意味着该模型在当前状态下不能部署在Flowable引擎上。", - "MODEL.CONFLICT.WRITE": "不能保存模型: '{{userFullName}}'对该模型进行了更改", - "MODEL.CONFLICT.WRITE.OPTIONS": "选择一个选项来解决此冲突:", - "MODEL.CONFLICT.WRITE.OPTION.OVERWRITE": "覆盖其他模型", - "MODEL.CONFLICT.WRITE.OPTION.DISCARDCHANGES": "放弃我的改变", - "MODEL.CONFLICT.WRITE.OPTION.SAVEAS": "保存为新模型", - "MODEL.CONFLICT.WRITE.OPTION.NEWVERSION": "创建新版本", - "MODEL.CONFLICT.SAVEAS" : "另存为:", - - "EVENT_TYPE.ACTIVITY.COMPENSATE.TOOLTIP": "一项活动将作为对另一活动的补偿而被执行。事件针对即将执行的活动进行补偿。", - "EVENT_TYPE.ACTIVITY.COMPLETED.TOOLTIP": "一项活动已圆满完成。", - "EVENT_TYPE.ACTIVITY.ERROR.RECEIVED.TOOLTIP": "活动已接收到错误事件。在活动接收到实际错误之前发送", - "EVENT_TYPE.MEMBERSHIP.CREATED.TOOLTIP": "创建了新的membership", - "EVENT_TYPE.MEMBERSHIP.DELETED.TOOLTIP": "单个membership已被删除", - "EVENT_TYPE.MEMBERSHIPS.DELETED.TOOLTIP": "相关组中的所有成员已被删除。由于可能的原因,个别事件不会被派遣。", - "EVENT_TYPE.TASK.ASSIGNED.TOOLTIP": "一个任务已经被分配人了。这将抛出一个实体更新事件", - "EVENT_TYPE.TASK.COMPLETED.TOOLTIP": "一个任务已经被完成。在删除任务实体之前调度", - "EVENT_TYPE.UNCAUGHT.BPMNERROR.TOOLTIP": "当BPMN错误被抛出,但未在流程中捕获时", - "EVENT_TYPE.VARIABLE.CREATED.TOOLTIP": "已经创建了一个新的变量", - "EVENT_TYPE.VARIABLE.DELETED.TOOLTIP": "已删除现有变量", - "EVENT_TYPE.VARIABLE.UPDATED.TOOLTIP": "已更新现有变量", - - "PROPERTY.DECISIONTABLEREFERENCE.EMPTY" : "没有选择引用", - "PROPERTY.DECISIONTABLEREFERENCE.TITLE" : "决策表引用", - "PROPERTY.DECISIONTABLEREFERENCE.ERROR.FORM" : "加载决策表出现错误. 稍后再试一次", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.LOADING" : "加载决策表...", - "PROPERTY.DECISIONTABLEREFERENCE.DECISIONTABLE.EMPTY" : "此文件夹不包含任何决策表", - - "PROPERTY.CASEREFERENCE.EMPTY" : "没有选择引用", - "PROPERTY.CASEREFERENCE.TITLE" : "案例型引用", - "PROPERTY.CASEREFERENCE.ERROR.FORM" : "加载案例模型时出错。稍后再试一次", - "PROPERTY.CASEREFERENCE.CASE.LOADING" : "加载案例模型...", - "PROPERTY.CASEREFERENCE.CASE.EMPTY" : "此文件夹不包含任何案例模型" -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/android-chrome-192x192.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/android-chrome-192x192.png deleted file mode 100644 index c1a85b6e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/android-chrome-192x192.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/android-chrome-384x384.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/android-chrome-384x384.png deleted file mode 100644 index 9abd2c59..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/android-chrome-384x384.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/apple-touch-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/apple-touch-icon.png deleted file mode 100644 index de1b41b6..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/apple-touch-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/favicon-16x16.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/favicon-16x16.png deleted file mode 100644 index 162016fc..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/favicon-16x16.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/favicon-32x32.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/favicon-32x32.png deleted file mode 100644 index dc5e2cd3..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/favicon-32x32.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/flowable-logo.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/flowable-logo.png deleted file mode 100644 index cf49ee74..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/flowable-logo.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/flowable-logo@2x.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/flowable-logo@2x.png deleted file mode 100644 index 13938c0e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/flowable-logo@2x.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/amountfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/amountfield-icon.png deleted file mode 100644 index 1f4b7c7d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/amountfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/booleanfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/booleanfield-icon.png deleted file mode 100644 index 8933752f..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/booleanfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/choicefield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/choicefield-icon.png deleted file mode 100644 index e4ebd200..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/choicefield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/datefield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/datefield-icon.png deleted file mode 100644 index 10348160..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/datefield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/decimalfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/decimalfield-icon.png deleted file mode 100644 index 1f4b7c7d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/decimalfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/dropdownfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/dropdownfield-icon.png deleted file mode 100644 index c76a2413..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/dropdownfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/dynamic-table-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/dynamic-table-icon.png deleted file mode 100644 index 9da42814..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/dynamic-table-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/group-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/group-icon.png deleted file mode 100644 index 31703862..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/group-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/headline-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/headline-icon.png deleted file mode 100644 index 8ac38156..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/headline-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/headline-with-line-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/headline-with-line-icon.png deleted file mode 100644 index ce7e9b68..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/headline-with-line-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/horizontal-line-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/horizontal-line-icon.png deleted file mode 100644 index 910a352e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/horizontal-line-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/hyperlink-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/hyperlink-icon.png deleted file mode 100644 index 05adbe9a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/hyperlink-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/multi-line-textfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/multi-line-textfield-icon.png deleted file mode 100644 index 76e992a5..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/multi-line-textfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/numberfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/numberfield-icon.png deleted file mode 100644 index 8edac398..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/numberfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/password-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/password-icon.png deleted file mode 100644 index a8d09818..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/password-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/peoplefield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/peoplefield-icon.png deleted file mode 100644 index e6c45d5e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/peoplefield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/readonly-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/readonly-icon.png deleted file mode 100644 index 0b11705b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/readonly-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/readonly-text-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/readonly-text-icon.png deleted file mode 100644 index 1cc9f19c..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/readonly-text-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/spacer-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/spacer-icon.png deleted file mode 100644 index 74b1c96b..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/spacer-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/textfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/textfield-icon.png deleted file mode 100644 index 92526b2f..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/textfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/uploadfield-icon.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/uploadfield-icon.png deleted file mode 100644 index fffb558d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/form-builder/uploadfield-icon.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/glasspane.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/glasspane.png deleted file mode 100644 index 8327c25d..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/glasspane.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/line-1px.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/line-1px.png deleted file mode 100644 index d8f08f30..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/line-1px.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/line.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/line.png deleted file mode 100644 index 31a2b968..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/line.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/mstile-150x150.png b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/mstile-150x150.png deleted file mode 100644 index a819aa8a..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/mstile-150x150.png and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/safari-pinned-tab.svg b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/safari-pinned-tab.svg deleted file mode 100644 index d137f62c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/safari-pinned-tab.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Created by potrace 1.11, written by Peter Selinger 2001-2013 - - - - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/open-group.gif b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/open-group.gif deleted file mode 100644 index e78b4966..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/open-group.gif and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/sequenceflow-bendpoint.gif b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/sequenceflow-bendpoint.gif deleted file mode 100644 index b088c86e..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/sequenceflow-bendpoint.gif and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/tour-dnd.gif b/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/tour-dnd.gif deleted file mode 100644 index 24fb73bf..00000000 Binary files a/io.sc.platform.lcdp.frontend/public/flowable/modeler/images/tour/tour-dnd.gif and /dev/null differ diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/index.html b/io.sc.platform.lcdp.frontend/public/flowable/modeler/index.html deleted file mode 100644 index b6825bdd..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/index.html +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - - - - - - Flowable Modeler - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - {{alerts.current.message}} - -
- {{alerts.queue.length + 1}} -
-
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-animate_1.3.13/angular-animate.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-animate_1.3.13/angular-animate.js deleted file mode 100644 index 8cd592d7..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-animate_1.3.13/angular-animate.js +++ /dev/null @@ -1,2137 +0,0 @@ -/** - * @license AngularJS v1.3.13 - * (c) 2010-2014 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular, undefined) {'use strict'; - -/* jshint maxlen: false */ - -/** - * @ngdoc module - * @name ngAnimate - * @description - * - * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives. - * - *
- * - * # Usage - * - * To see animations in action, all that is required is to define the appropriate CSS classes - * or to register a JavaScript animation via the `myModule.animation()` function. The directives that support animation automatically are: - * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation - * by using the `$animate` service. - * - * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives: - * - * | Directive | Supported Animations | - * |----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------| - * | {@link ng.directive:ngRepeat#animations ngRepeat} | enter, leave and move | - * | {@link ngRoute.directive:ngView#animations ngView} | enter and leave | - * | {@link ng.directive:ngInclude#animations ngInclude} | enter and leave | - * | {@link ng.directive:ngSwitch#animations ngSwitch} | enter and leave | - * | {@link ng.directive:ngIf#animations ngIf} | enter and leave | - * | {@link ng.directive:ngClass#animations ngClass} | add and remove (the CSS class(es) present) | - * | {@link ng.directive:ngShow#animations ngShow} & {@link ng.directive:ngHide#animations ngHide} | add and remove (the ng-hide class value) | - * | {@link ng.directive:form#animation-hooks form} & {@link ng.directive:ngModel#animation-hooks ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | - * | {@link module:ngMessages#animations ngMessages} | add and remove (ng-active & ng-inactive) | - * | {@link module:ngMessages#animations ngMessage} | enter and leave | - * - * You can find out more information about animations upon visiting each directive page. - * - * Below is an example of how to apply animations to a directive that supports animation hooks: - * - * ```html - * - * - * - * - * ``` - * - * Keep in mind that, by default, if an animation is running, any child elements cannot be animated - * until the parent element's animation has completed. This blocking feature can be overridden by - * placing the `ng-animate-children` attribute on a parent container tag. - * - * ```html - *
- *
- *
- * ... - *
- *
- *
- * ``` - * - * When the `on` expression value changes and an animation is triggered then each of the elements within - * will all animate without the block being applied to child elements. - * - * ## Are animations run when the application starts? - * No they are not. When an application is bootstrapped Angular will disable animations from running to avoid - * a frenzy of animations from being triggered as soon as the browser has rendered the screen. For this to work, - * Angular will wait for two digest cycles until enabling animations. From there on, any animation-triggering - * layout changes in the application will trigger animations as normal. - * - * In addition, upon bootstrap, if the routing system or any directives or load remote data (via $http) then Angular - * will automatically extend the wait time to enable animations once **all** of the outbound HTTP requests - * are complete. - * - * ## CSS-defined Animations - * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes - * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported - * and can be used to play along with this naming structure. - * - * The following code below demonstrates how to perform animations using **CSS transitions** with Angular: - * - * ```html - * - * - *
- *
- *
- * ``` - * - * The following code below demonstrates how to perform animations using **CSS animations** with Angular: - * - * ```html - * - * - *
- *
- *
- * ``` - * - * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing. - * - * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add - * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically - * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be - * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end - * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element - * has no CSS transition/animation classes applied to it. - * - * ### Structural transition animations - * - * Structural transitions (such as enter, leave and move) will always apply a `0s none` transition - * value to force the browser into rendering the styles defined in the setup (`.ng-enter`, `.ng-leave` - * or `.ng-move`) class. This means that any active transition animations operating on the element - * will be cut off to make way for the enter, leave or move animation. - * - * ### Class-based transition animations - * - * Class-based transitions refer to transition animations that are triggered when a CSS class is - * added to or removed from the element (via `$animate.addClass`, `$animate.removeClass`, - * `$animate.setClass`, or by directives such as `ngClass`, `ngModel` and `form`). - * They are different when compared to structural animations since they **do not cancel existing - * animations** nor do they **block successive transitions** from rendering on the same element. - * This distinction allows for **multiple class-based transitions** to be performed on the same element. - * - * In addition to ngAnimate supporting the default (natural) functionality of class-based transition - * animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the - * developer in further styling the element throughout the transition animation. Earlier versions - * of ngAnimate may have caused natural CSS transitions to break and not render properly due to - * $animate temporarily blocking transitions using `0s none` in order to allow the setup CSS class - * (the `-add` or `-remove` class) to be applied without triggering an animation. However, as of - * **version 1.3**, this workaround has been removed with ngAnimate and all non-ngAnimate CSS - * class transitions are compatible with ngAnimate. - * - * There is, however, one special case when dealing with class-based transitions in ngAnimate. - * When rendering class-based transitions that make use of the setup and active CSS classes - * (e.g. `.fade-add` and `.fade-add-active` for when `.fade` is added) be sure to define - * the transition value **on the active CSS class** and not the setup class. - * - * ```css - * .fade-add { - * /* remember to place a 0s transition here - * to ensure that the styles are applied instantly - * even if the element already has a transition style */ - * transition:0s linear all; - * - * /* starting CSS styles */ - * opacity:1; - * } - * .fade-add.fade-add-active { - * /* this will be the length of the animation */ - * transition:1s linear all; - * opacity:0; - * } - * ``` - * - * The setup CSS class (in this case `.fade-add`) also has a transition style property, however, it - * has a duration of zero. This may not be required, however, incase the browser is unable to render - * the styling present in this CSS class instantly then it could be that the browser is attempting - * to perform an unnecessary transition. - * - * This workaround, however, does not apply to standard class-based transitions that are rendered - * when a CSS class containing a transition is applied to an element: - * - * ```css - * /* this works as expected */ - * .fade { - * transition:1s linear all; - * opacity:0; - * } - * ``` - * - * Please keep this in mind when coding the CSS markup that will be used within class-based transitions. - * Also, try not to mix the two class-based animation flavors together since the CSS code may become - * overly complex. - * - * - * ### Preventing Collisions With Third Party Libraries - * - * Some third-party frameworks place animation duration defaults across many element or className - * selectors in order to make their code small and reuseable. This can lead to issues with ngAnimate, which - * is expecting actual animations on these elements and has to wait for their completion. - * - * You can prevent this unwanted behavior by using a prefix on all your animation classes: - * - * ```css - * /* prefixed with animate- */ - * .animate-fade-add.animate-fade-add-active { - * transition:1s linear all; - * opacity:0; - * } - * ``` - * - * You then configure `$animate` to enforce this prefix: - * - * ```js - * $animateProvider.classNameFilter(/animate-/); - * ``` - *
- * - * ### CSS Staggering Animations - * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a - * curtain-like effect. The ngAnimate module (versions >=1.2) supports staggering animations and the stagger effect can be - * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for - * the animation. The style property expected within the stagger class can either be a **transition-delay** or an - * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). - * - * ```css - * .my-animation.ng-enter { - * /* standard transition code */ - * -webkit-transition: 1s linear all; - * transition: 1s linear all; - * opacity:0; - * } - * .my-animation.ng-enter-stagger { - * /* this will have a 100ms delay between each successive leave animation */ - * -webkit-transition-delay: 0.1s; - * transition-delay: 0.1s; - * - * /* in case the stagger doesn't work then these two values - * must be set to 0 to avoid an accidental CSS inheritance */ - * -webkit-transition-duration: 0s; - * transition-duration: 0s; - * } - * .my-animation.ng-enter.ng-enter-active { - * /* standard transition styles */ - * opacity:1; - * } - * ``` - * - * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations - * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this - * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation - * will also be reset if more than 10ms has passed after the last animation has been fired. - * - * The following code will issue the **ng-leave-stagger** event on the element provided: - * - * ```js - * var kids = parent.children(); - * - * $animate.leave(kids[0]); //stagger index=0 - * $animate.leave(kids[1]); //stagger index=1 - * $animate.leave(kids[2]); //stagger index=2 - * $animate.leave(kids[3]); //stagger index=3 - * $animate.leave(kids[4]); //stagger index=4 - * - * $timeout(function() { - * //stagger has reset itself - * $animate.leave(kids[5]); //stagger index=0 - * $animate.leave(kids[6]); //stagger index=1 - * }, 100, false); - * ``` - * - * Stagger animations are currently only supported within CSS-defined animations. - * - * ## JavaScript-defined Animations - * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not - * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module. - * - * ```js - * //!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application. - * var ngModule = angular.module('YourApp', ['ngAnimate']); - * ngModule.animation('.my-crazy-animation', function() { - * return { - * enter: function(element, done) { - * //run the animation here and call done when the animation is complete - * return function(cancelled) { - * //this (optional) function will be called when the animation - * //completes or when the animation is cancelled (the cancelled - * //flag will be set to true if cancelled). - * }; - * }, - * leave: function(element, done) { }, - * move: function(element, done) { }, - * - * //animation that can be triggered before the class is added - * beforeAddClass: function(element, className, done) { }, - * - * //animation that can be triggered after the class is added - * addClass: function(element, className, done) { }, - * - * //animation that can be triggered before the class is removed - * beforeRemoveClass: function(element, className, done) { }, - * - * //animation that can be triggered after the class is removed - * removeClass: function(element, className, done) { } - * }; - * }); - * ``` - * - * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run - * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits - * the element's CSS class attribute value and then run the matching animation event function (if found). - * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will - * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported). - * - * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned. - * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run, - * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation - * or transition code that is defined via a stylesheet). - * - * - * ### Applying Directive-specific Styles to an Animation - * In some cases a directive or service may want to provide `$animate` with extra details that the animation will - * include into its animation. Let's say for example we wanted to render an animation that animates an element - * towards the mouse coordinates as to where the user clicked last. By collecting the X/Y coordinates of the click - * (via the event parameter) we can set the `top` and `left` styles into an object and pass that into our function - * call to `$animate.addClass`. - * - * ```js - * canvas.on('click', function(e) { - * $animate.addClass(element, 'on', { - * to: { - * left : e.client.x + 'px', - * top : e.client.y + 'px' - * } - * }): - * }); - * ``` - * - * Now when the animation runs, and a transition or keyframe animation is picked up, then the animation itself will - * also include and transition the styling of the `left` and `top` properties into its running animation. If we want - * to provide some starting animation values then we can do so by placing the starting animations styles into an object - * called `from` in the same object as the `to` animations. - * - * ```js - * canvas.on('click', function(e) { - * $animate.addClass(element, 'on', { - * from: { - * position: 'absolute', - * left: '0px', - * top: '0px' - * }, - * to: { - * left : e.client.x + 'px', - * top : e.client.y + 'px' - * } - * }): - * }); - * ``` - * - * Once the animation is complete or cancelled then the union of both the before and after styles are applied to the - * element. If `ngAnimate` is not present then the styles will be applied immediately. - * - */ - -angular.module('ngAnimate', ['ng']) - - /** - * @ngdoc provider - * @name $animateProvider - * @description - * - * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module. - * When an animation is triggered, the $animate service will query the $animate service to find any animations that match - * the provided name value. - * - * Requires the {@link ngAnimate `ngAnimate`} module to be installed. - * - * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. - * - */ - .directive('ngAnimateChildren', function() { - var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; - return function(scope, element, attrs) { - var val = attrs.ngAnimateChildren; - if (angular.isString(val) && val.length === 0) { //empty attribute - element.data(NG_ANIMATE_CHILDREN, true); - } else { - scope.$watch(val, function(value) { - element.data(NG_ANIMATE_CHILDREN, !!value); - }); - } - }; - }) - - //this private service is only used within CSS-enabled animations - //IE8 + IE9 do not support rAF natively, but that is fine since they - //also don't support transitions and keyframes which means that the code - //below will never be used by the two browsers. - .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) { - var bod = $document[0].body; - return function(fn) { - //the returned function acts as the cancellation function - return $$rAF(function() { - //the line below will force the browser to perform a repaint - //so that all the animated elements within the animation frame - //will be properly updated and drawn on screen. This is - //required to perform multi-class CSS based animations with - //Firefox. DO NOT REMOVE THIS LINE. - var a = bod.offsetWidth + 1; - fn(); - }); - }; - }]) - - .config(['$provide', '$animateProvider', function($provide, $animateProvider) { - var noop = angular.noop; - var forEach = angular.forEach; - var selectors = $animateProvider.$$selectors; - var isArray = angular.isArray; - var isString = angular.isString; - var isObject = angular.isObject; - - var ELEMENT_NODE = 1; - var NG_ANIMATE_STATE = '$$ngAnimateState'; - var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; - var NG_ANIMATE_CLASS_NAME = 'ng-animate'; - var rootAnimateState = {running: true}; - - function extractElementNode(element) { - for (var i = 0; i < element.length; i++) { - var elm = element[i]; - if (elm.nodeType == ELEMENT_NODE) { - return elm; - } - } - } - - function prepareElement(element) { - return element && angular.element(element); - } - - function stripCommentsFromElement(element) { - return angular.element(extractElementNode(element)); - } - - function isMatchingElement(elm1, elm2) { - return extractElementNode(elm1) == extractElementNode(elm2); - } - var $$jqLite; - $provide.decorator('$animate', - ['$delegate', '$$q', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', '$templateRequest', '$$jqLite', - function($delegate, $$q, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document, $templateRequest, $$$jqLite) { - - $$jqLite = $$$jqLite; - $rootElement.data(NG_ANIMATE_STATE, rootAnimateState); - - // Wait until all directive and route-related templates are downloaded and - // compiled. The $templateRequest.totalPendingRequests variable keeps track of - // all of the remote templates being currently downloaded. If there are no - // templates currently downloading then the watcher will still fire anyway. - var deregisterWatch = $rootScope.$watch( - function() { return $templateRequest.totalPendingRequests; }, - function(val, oldVal) { - if (val !== 0) return; - deregisterWatch(); - - // Now that all templates have been downloaded, $animate will wait until - // the post digest queue is empty before enabling animations. By having two - // calls to $postDigest calls we can ensure that the flag is enabled at the - // very end of the post digest queue. Since all of the animations in $animate - // use $postDigest, it's important that the code below executes at the end. - // This basically means that the page is fully downloaded and compiled before - // any animations are triggered. - $rootScope.$$postDigest(function() { - $rootScope.$$postDigest(function() { - rootAnimateState.running = false; - }); - }); - } - ); - - var globalAnimationCounter = 0; - var classNameFilter = $animateProvider.classNameFilter(); - var isAnimatableClassName = !classNameFilter - ? function() { return true; } - : function(className) { - return classNameFilter.test(className); - }; - - function classBasedAnimationsBlocked(element, setter) { - var data = element.data(NG_ANIMATE_STATE) || {}; - if (setter) { - data.running = true; - data.structural = true; - element.data(NG_ANIMATE_STATE, data); - } - return data.disabled || (data.running && data.structural); - } - - function runAnimationPostDigest(fn) { - var cancelFn, defer = $$q.defer(); - defer.promise.$$cancelFn = function() { - cancelFn && cancelFn(); - }; - $rootScope.$$postDigest(function() { - cancelFn = fn(function() { - defer.resolve(); - }); - }); - return defer.promise; - } - - function parseAnimateOptions(options) { - // some plugin code may still be passing in the callback - // function as the last param for the $animate methods so - // it's best to only allow string or array values for now - if (isObject(options)) { - if (options.tempClasses && isString(options.tempClasses)) { - options.tempClasses = options.tempClasses.split(/\s+/); - } - return options; - } - } - - function resolveElementClasses(element, cache, runningAnimations) { - runningAnimations = runningAnimations || {}; - - var lookup = {}; - forEach(runningAnimations, function(data, selector) { - forEach(selector.split(' '), function(s) { - lookup[s]=data; - }); - }); - - var hasClasses = Object.create(null); - forEach((element.attr('class') || '').split(/\s+/), function(className) { - hasClasses[className] = true; - }); - - var toAdd = [], toRemove = []; - forEach((cache && cache.classes) || [], function(status, className) { - var hasClass = hasClasses[className]; - var matchingAnimation = lookup[className] || {}; - - // When addClass and removeClass is called then $animate will check to - // see if addClass and removeClass cancel each other out. When there are - // more calls to removeClass than addClass then the count falls below 0 - // and then the removeClass animation will be allowed. Otherwise if the - // count is above 0 then that means an addClass animation will commence. - // Once an animation is allowed then the code will also check to see if - // there exists any on-going animation that is already adding or remvoing - // the matching CSS class. - if (status === false) { - //does it have the class or will it have the class - if (hasClass || matchingAnimation.event == 'addClass') { - toRemove.push(className); - } - } else if (status === true) { - //is the class missing or will it be removed? - if (!hasClass || matchingAnimation.event == 'removeClass') { - toAdd.push(className); - } - } - }); - - return (toAdd.length + toRemove.length) > 0 && [toAdd.join(' '), toRemove.join(' ')]; - } - - function lookup(name) { - if (name) { - var matches = [], - flagMap = {}, - classes = name.substr(1).split('.'); - - //the empty string value is the default animation - //operation which performs CSS transition and keyframe - //animations sniffing. This is always included for each - //element animation procedure if the browser supports - //transitions and/or keyframe animations. The default - //animation is added to the top of the list to prevent - //any previous animations from affecting the element styling - //prior to the element being animated. - if ($sniffer.transitions || $sniffer.animations) { - matches.push($injector.get(selectors[''])); - } - - for (var i=0; i < classes.length; i++) { - var klass = classes[i], - selectorFactoryName = selectors[klass]; - if (selectorFactoryName && !flagMap[klass]) { - matches.push($injector.get(selectorFactoryName)); - flagMap[klass] = true; - } - } - return matches; - } - } - - function animationRunner(element, animationEvent, className, options) { - //transcluded directives may sometimes fire an animation using only comment nodes - //best to catch this early on to prevent any animation operations from occurring - var node = element[0]; - if (!node) { - return; - } - - if (options) { - options.to = options.to || {}; - options.from = options.from || {}; - } - - var classNameAdd; - var classNameRemove; - if (isArray(className)) { - classNameAdd = className[0]; - classNameRemove = className[1]; - if (!classNameAdd) { - className = classNameRemove; - animationEvent = 'removeClass'; - } else if (!classNameRemove) { - className = classNameAdd; - animationEvent = 'addClass'; - } else { - className = classNameAdd + ' ' + classNameRemove; - } - } - - var isSetClassOperation = animationEvent == 'setClass'; - var isClassBased = isSetClassOperation - || animationEvent == 'addClass' - || animationEvent == 'removeClass' - || animationEvent == 'animate'; - - var currentClassName = element.attr('class'); - var classes = currentClassName + ' ' + className; - if (!isAnimatableClassName(classes)) { - return; - } - - var beforeComplete = noop, - beforeCancel = [], - before = [], - afterComplete = noop, - afterCancel = [], - after = []; - - var animationLookup = (' ' + classes).replace(/\s+/g,'.'); - forEach(lookup(animationLookup), function(animationFactory) { - var created = registerAnimation(animationFactory, animationEvent); - if (!created && isSetClassOperation) { - registerAnimation(animationFactory, 'addClass'); - registerAnimation(animationFactory, 'removeClass'); - } - }); - - function registerAnimation(animationFactory, event) { - var afterFn = animationFactory[event]; - var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)]; - if (afterFn || beforeFn) { - if (event == 'leave') { - beforeFn = afterFn; - //when set as null then animation knows to skip this phase - afterFn = null; - } - after.push({ - event: event, fn: afterFn - }); - before.push({ - event: event, fn: beforeFn - }); - return true; - } - } - - function run(fns, cancellations, allCompleteFn) { - var animations = []; - forEach(fns, function(animation) { - animation.fn && animations.push(animation); - }); - - var count = 0; - function afterAnimationComplete(index) { - if (cancellations) { - (cancellations[index] || noop)(); - if (++count < animations.length) return; - cancellations = null; - } - allCompleteFn(); - } - - //The code below adds directly to the array in order to work with - //both sync and async animations. Sync animations are when the done() - //operation is called right away. DO NOT REFACTOR! - forEach(animations, function(animation, index) { - var progress = function() { - afterAnimationComplete(index); - }; - switch (animation.event) { - case 'setClass': - cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress, options)); - break; - case 'animate': - cancellations.push(animation.fn(element, className, options.from, options.to, progress)); - break; - case 'addClass': - cancellations.push(animation.fn(element, classNameAdd || className, progress, options)); - break; - case 'removeClass': - cancellations.push(animation.fn(element, classNameRemove || className, progress, options)); - break; - default: - cancellations.push(animation.fn(element, progress, options)); - break; - } - }); - - if (cancellations && cancellations.length === 0) { - allCompleteFn(); - } - } - - return { - node: node, - event: animationEvent, - className: className, - isClassBased: isClassBased, - isSetClassOperation: isSetClassOperation, - applyStyles: function() { - if (options) { - element.css(angular.extend(options.from || {}, options.to || {})); - } - }, - before: function(allCompleteFn) { - beforeComplete = allCompleteFn; - run(before, beforeCancel, function() { - beforeComplete = noop; - allCompleteFn(); - }); - }, - after: function(allCompleteFn) { - afterComplete = allCompleteFn; - run(after, afterCancel, function() { - afterComplete = noop; - allCompleteFn(); - }); - }, - cancel: function() { - if (beforeCancel) { - forEach(beforeCancel, function(cancelFn) { - (cancelFn || noop)(true); - }); - beforeComplete(true); - } - if (afterCancel) { - forEach(afterCancel, function(cancelFn) { - (cancelFn || noop)(true); - }); - afterComplete(true); - } - } - }; - } - - /** - * @ngdoc service - * @name $animate - * @kind object - * - * @description - * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations. - * When any of these operations are run, the $animate service - * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object) - * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run. - * - * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives - * will work out of the box without any extra configuration. - * - * Requires the {@link ngAnimate `ngAnimate`} module to be installed. - * - * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. - * ## Callback Promises - * With AngularJS 1.3, each of the animation methods, on the `$animate` service, return a promise when called. The - * promise itself is then resolved once the animation has completed itself, has been cancelled or has been - * skipped due to animations being disabled. (Note that even if the animation is cancelled it will still - * call the resolve function of the animation.) - * - * ```js - * $animate.enter(element, container).then(function() { - * //...this is called once the animation is complete... - * }); - * ``` - * - * Also note that, due to the nature of the callback promise, if any Angular-specific code (like changing the scope, - * location of the page, etc...) is executed within the callback promise then be sure to wrap the code using - * `$scope.$apply(...)`; - * - * ```js - * $animate.leave(element).then(function() { - * $scope.$apply(function() { - * $location.path('/new-page'); - * }); - * }); - * ``` - * - * An animation can also be cancelled by calling the `$animate.cancel(promise)` method with the provided - * promise that was returned when the animation was started. - * - * ```js - * var promise = $animate.addClass(element, 'super-long-animation'); - * promise.then(function() { - * //this will still be called even if cancelled - * }); - * - * element.on('click', function() { - * //tooo lazy to wait for the animation to end - * $animate.cancel(promise); - * }); - * ``` - * - * (Keep in mind that the promise cancellation is unique to `$animate` since promises in - * general cannot be cancelled.) - * - */ - return { - /** - * @ngdoc method - * @name $animate#animate - * @kind function - * - * @description - * Performs an inline animation on the element which applies the provided `to` and `from` CSS styles to the element. - * If any detected CSS transition, keyframe or JavaScript matches the provided `className` value then the animation - * will take on the provided styles. For example, if a transition animation is set for the given className then the - * provided `from` and `to` styles will be applied alongside the given transition. If a JavaScript animation is - * detected then the provided styles will be given in as function paramters. - * - * ```js - * ngModule.animation('.my-inline-animation', function() { - * return { - * animate : function(element, className, from, to, done) { - * //styles - * } - * } - * }); - * ``` - * - * Below is a breakdown of each step that occurs during the `animate` animation: - * - * | Animation Step | What the element class attribute looks like | - * |-----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------| - * | 1. `$animate.animate(...)` is called | `class="my-animation"` | - * | 2. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | - * | 3. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | - * | 4. the `className` class value is added to the element | `class="my-animation ng-animate className"` | - * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate className"` | - * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.className` class styling is applied right away| `class="my-animation ng-animate className"` | - * | 7. `$animate` applies the provided collection of `from` CSS styles to the element | `class="my-animation ng-animate className"` | - * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate className"` | - * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate className"` | - * | 10. the `className-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate className className-active"` | - * | 11. `$animate` applies the collection of `to` CSS styles to the element which are then handled by the transition | `class="my-animation ng-animate className className-active"` | - * | 12. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate className className-active"` | - * | 13. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | - * | 14. The returned promise is resolved. | `class="my-animation"` | - * - * @param {DOMElement} element the element that will be the focus of the enter animation - * @param {object} from a collection of CSS styles that will be applied to the element at the start of the animation - * @param {object} to a collection of CSS styles that the element will animate towards - * @param {string=} className an optional CSS class that will be added to the element for the duration of the animation (the default class is `ng-inline-animate`) - * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - animate: function(element, from, to, className, options) { - className = className || 'ng-inline-animate'; - options = parseAnimateOptions(options) || {}; - options.from = to ? from : null; - options.to = to ? to : from; - - return runAnimationPostDigest(function(done) { - return performAnimation('animate', className, stripCommentsFromElement(element), null, null, noop, options, done); - }); - }, - - /** - * @ngdoc method - * @name $animate#enter - * @kind function - * - * @description - * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once - * the animation is started, the following CSS classes will be present on the element for the duration of the animation: - * - * Below is a breakdown of each step that occurs during enter animation: - * - * | Animation Step | What the element class attribute looks like | - * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| - * | 1. `$animate.enter(...)` is called | `class="my-animation"` | - * | 2. element is inserted into the `parentElement` element or beside the `afterElement` element | `class="my-animation"` | - * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | - * | 4. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | - * | 5. the `.ng-enter` class is added to the element | `class="my-animation ng-animate ng-enter"` | - * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-enter"` | - * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-enter` class styling is applied right away | `class="my-animation ng-animate ng-enter"` | - * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-enter"` | - * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-enter"` | - * | 10. the `.ng-enter-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-enter ng-enter-active"` | - * | 11. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-enter ng-enter-active"` | - * | 12. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | - * | 13. The returned promise is resolved. | `class="my-animation"` | - * - * @param {DOMElement} element the element that will be the focus of the enter animation - * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation - * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation - * @param {object=} options an optional collection of options that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - enter: function(element, parentElement, afterElement, options) { - options = parseAnimateOptions(options); - element = angular.element(element); - parentElement = prepareElement(parentElement); - afterElement = prepareElement(afterElement); - - classBasedAnimationsBlocked(element, true); - $delegate.enter(element, parentElement, afterElement); - return runAnimationPostDigest(function(done) { - return performAnimation('enter', 'ng-enter', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done); - }); - }, - - /** - * @ngdoc method - * @name $animate#leave - * @kind function - * - * @description - * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once - * the animation is started, the following CSS classes will be added for the duration of the animation: - * - * Below is a breakdown of each step that occurs during leave animation: - * - * | Animation Step | What the element class attribute looks like | - * |-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------| - * | 1. `$animate.leave(...)` is called | `class="my-animation"` | - * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | - * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | - * | 4. the `.ng-leave` class is added to the element | `class="my-animation ng-animate ng-leave"` | - * | 5. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-leave"` | - * | 6. `$animate` blocks all CSS transitions on the element to ensure the `.ng-leave` class styling is applied right away | `class="my-animation ng-animate ng-leave"` | - * | 7. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-leave"` | - * | 8. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-leave"` | - * | 9. the `.ng-leave-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-leave ng-leave-active"` | - * | 10. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-leave ng-leave-active"` | - * | 11. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | - * | 12. The element is removed from the DOM | ... | - * | 13. The returned promise is resolved. | ... | - * - * @param {DOMElement} element the element that will be the focus of the leave animation - * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - leave: function(element, options) { - options = parseAnimateOptions(options); - element = angular.element(element); - - cancelChildAnimations(element); - classBasedAnimationsBlocked(element, true); - return runAnimationPostDigest(function(done) { - return performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() { - $delegate.leave(element); - }, options, done); - }); - }, - - /** - * @ngdoc method - * @name $animate#move - * @kind function - * - * @description - * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or - * add the element directly after the afterElement element if present. Then the move animation will be run. Once - * the animation is started, the following CSS classes will be added for the duration of the animation: - * - * Below is a breakdown of each step that occurs during move animation: - * - * | Animation Step | What the element class attribute looks like | - * |----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------| - * | 1. `$animate.move(...)` is called | `class="my-animation"` | - * | 2. element is moved into the parentElement element or beside the afterElement element | `class="my-animation"` | - * | 3. `$animate` waits for the next digest to start the animation | `class="my-animation ng-animate"` | - * | 4. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | - * | 5. the `.ng-move` class is added to the element | `class="my-animation ng-animate ng-move"` | - * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate ng-move"` | - * | 7. `$animate` blocks all CSS transitions on the element to ensure the `.ng-move` class styling is applied right away | `class="my-animation ng-animate ng-move"` | - * | 8. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate ng-move"` | - * | 9. `$animate` removes the CSS transition block placed on the element | `class="my-animation ng-animate ng-move"` | - * | 10. the `.ng-move-active` class is added (this triggers the CSS transition/animation) | `class="my-animation ng-animate ng-move ng-move-active"` | - * | 11. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate ng-move ng-move-active"` | - * | 12. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | - * | 13. The returned promise is resolved. | `class="my-animation"` | - * - * @param {DOMElement} element the element that will be the focus of the move animation - * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation - * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation - * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - move: function(element, parentElement, afterElement, options) { - options = parseAnimateOptions(options); - element = angular.element(element); - parentElement = prepareElement(parentElement); - afterElement = prepareElement(afterElement); - - cancelChildAnimations(element); - classBasedAnimationsBlocked(element, true); - $delegate.move(element, parentElement, afterElement); - return runAnimationPostDigest(function(done) { - return performAnimation('move', 'ng-move', stripCommentsFromElement(element), parentElement, afterElement, noop, options, done); - }); - }, - - /** - * @ngdoc method - * @name $animate#addClass - * - * @description - * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class. - * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide - * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions - * or keyframes are defined on the -add-active or base CSS class). - * - * Below is a breakdown of each step that occurs during addClass animation: - * - * | Animation Step | What the element class attribute looks like | - * |--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| - * | 1. `$animate.addClass(element, 'super')` is called | `class="my-animation"` | - * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate"` | - * | 3. the `.super-add` class is added to the element | `class="my-animation ng-animate super-add"` | - * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate super-add"` | - * | 5. the `.super` and `.super-add-active` classes are added (this triggers the CSS transition/animation) | `class="my-animation ng-animate super super-add super-add-active"` | - * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate super super-add super-add-active"` | - * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate super super-add super-add-active"` | - * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation super"` | - * | 9. The super class is kept on the element | `class="my-animation super"` | - * | 10. The returned promise is resolved. | `class="my-animation super"` | - * - * @param {DOMElement} element the element that will be animated - * @param {string} className the CSS class that will be added to the element and then animated - * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - addClass: function(element, className, options) { - return this.setClass(element, className, [], options); - }, - - /** - * @ngdoc method - * @name $animate#removeClass - * - * @description - * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value - * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in - * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if - * no CSS transitions or keyframes are defined on the -remove or base CSS classes). - * - * Below is a breakdown of each step that occurs during removeClass animation: - * - * | Animation Step | What the element class attribute looks like | - * |----------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| - * | 1. `$animate.removeClass(element, 'super')` is called | `class="my-animation super"` | - * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation super ng-animate"` | - * | 3. the `.super-remove` class is added to the element | `class="my-animation super ng-animate super-remove"` | - * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation super ng-animate super-remove"` | - * | 5. the `.super-remove-active` classes are added and `.super` is removed (this triggers the CSS transition/animation) | `class="my-animation ng-animate super-remove super-remove-active"` | - * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate super-remove super-remove-active"` | - * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate super-remove super-remove-active"` | - * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation"` | - * | 9. The returned promise is resolved. | `class="my-animation"` | - * - * - * @param {DOMElement} element the element that will be animated - * @param {string} className the CSS class that will be animated and then removed from the element - * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - removeClass: function(element, className, options) { - return this.setClass(element, [], className, options); - }, - - /** - * - * @ngdoc method - * @name $animate#setClass - * - * @description Adds and/or removes the given CSS classes to and from the element. - * Once complete, the `done()` callback will be fired (if provided). - * - * | Animation Step | What the element class attribute looks like | - * |----------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------| - * | 1. `$animate.setClass(element, 'on', 'off')` is called | `class="my-animation off"` | - * | 2. `$animate` runs the JavaScript-defined animations detected on the element | `class="my-animation ng-animate off"` | - * | 3. the `.on-add` and `.off-remove` classes are added to the element | `class="my-animation ng-animate on-add off-remove off"` | - * | 4. `$animate` waits for a single animation frame (this performs a reflow) | `class="my-animation ng-animate on-add off-remove off"` | - * | 5. the `.on`, `.on-add-active` and `.off-remove-active` classes are added and `.off` is removed (this triggers the CSS transition/animation) | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | - * | 6. `$animate` scans the element styles to get the CSS transition/animation duration and delay | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | - * | 7. `$animate` waits for the animation to complete (via events and timeout) | `class="my-animation ng-animate on on-add on-add-active off-remove off-remove-active"` | - * | 8. The animation ends and all generated CSS classes are removed from the element | `class="my-animation on"` | - * | 9. The returned promise is resolved. | `class="my-animation on"` | - * - * @param {DOMElement} element the element which will have its CSS classes changed - * removed from it - * @param {string} add the CSS classes which will be added to the element - * @param {string} remove the CSS class which will be removed from the element - * CSS classes have been set on the element - * @param {object=} options an optional collection of styles that will be picked up by the CSS transition/animation - * @return {Promise} the animation callback promise - */ - setClass: function(element, add, remove, options) { - options = parseAnimateOptions(options); - - var STORAGE_KEY = '$$animateClasses'; - element = angular.element(element); - element = stripCommentsFromElement(element); - - if (classBasedAnimationsBlocked(element)) { - return $delegate.$$setClassImmediately(element, add, remove, options); - } - - // we're using a combined array for both the add and remove - // operations since the ORDER OF addClass and removeClass matters - var classes, cache = element.data(STORAGE_KEY); - var hasCache = !!cache; - if (!cache) { - cache = {}; - cache.classes = {}; - } - classes = cache.classes; - - add = isArray(add) ? add : add.split(' '); - forEach(add, function(c) { - if (c && c.length) { - classes[c] = true; - } - }); - - remove = isArray(remove) ? remove : remove.split(' '); - forEach(remove, function(c) { - if (c && c.length) { - classes[c] = false; - } - }); - - if (hasCache) { - if (options && cache.options) { - cache.options = angular.extend(cache.options || {}, options); - } - - //the digest cycle will combine all the animations into one function - return cache.promise; - } else { - element.data(STORAGE_KEY, cache = { - classes: classes, - options: options - }); - } - - return cache.promise = runAnimationPostDigest(function(done) { - var parentElement = element.parent(); - var elementNode = extractElementNode(element); - var parentNode = elementNode.parentNode; - // TODO(matsko): move this code into the animationsDisabled() function once #8092 is fixed - if (!parentNode || parentNode['$$NG_REMOVED'] || elementNode['$$NG_REMOVED']) { - done(); - return; - } - - var cache = element.data(STORAGE_KEY); - element.removeData(STORAGE_KEY); - - var state = element.data(NG_ANIMATE_STATE) || {}; - var classes = resolveElementClasses(element, cache, state.active); - return !classes - ? done() - : performAnimation('setClass', classes, element, parentElement, null, function() { - if (classes[0]) $delegate.$$addClassImmediately(element, classes[0]); - if (classes[1]) $delegate.$$removeClassImmediately(element, classes[1]); - }, cache.options, done); - }); - }, - - /** - * @ngdoc method - * @name $animate#cancel - * @kind function - * - * @param {Promise} animationPromise The animation promise that is returned when an animation is started. - * - * @description - * Cancels the provided animation. - */ - cancel: function(promise) { - promise.$$cancelFn(); - }, - - /** - * @ngdoc method - * @name $animate#enabled - * @kind function - * - * @param {boolean=} value If provided then set the animation on or off. - * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation - * @return {boolean} Current animation state. - * - * @description - * Globally enables/disables animations. - * - */ - enabled: function(value, element) { - switch (arguments.length) { - case 2: - if (value) { - cleanup(element); - } else { - var data = element.data(NG_ANIMATE_STATE) || {}; - data.disabled = true; - element.data(NG_ANIMATE_STATE, data); - } - break; - - case 1: - rootAnimateState.disabled = !value; - break; - - default: - value = !rootAnimateState.disabled; - break; - } - return !!value; - } - }; - - /* - all animations call this shared animation triggering function internally. - The animationEvent variable refers to the JavaScript animation event that will be triggered - and the className value is the name of the animation that will be applied within the - CSS code. Element, `parentElement` and `afterElement` are provided DOM elements for the animation - and the onComplete callback will be fired once the animation is fully complete. - */ - function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, options, doneCallback) { - var noopCancel = noop; - var runner = animationRunner(element, animationEvent, className, options); - if (!runner) { - fireDOMOperation(); - fireBeforeCallbackAsync(); - fireAfterCallbackAsync(); - closeAnimation(); - return noopCancel; - } - - animationEvent = runner.event; - className = runner.className; - var elementEvents = angular.element._data(runner.node); - elementEvents = elementEvents && elementEvents.events; - - if (!parentElement) { - parentElement = afterElement ? afterElement.parent() : element.parent(); - } - - //skip the animation if animations are disabled, a parent is already being animated, - //the element is not currently attached to the document body or then completely close - //the animation if any matching animations are not found at all. - //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found. - if (animationsDisabled(element, parentElement)) { - fireDOMOperation(); - fireBeforeCallbackAsync(); - fireAfterCallbackAsync(); - closeAnimation(); - return noopCancel; - } - - var ngAnimateState = element.data(NG_ANIMATE_STATE) || {}; - var runningAnimations = ngAnimateState.active || {}; - var totalActiveAnimations = ngAnimateState.totalActive || 0; - var lastAnimation = ngAnimateState.last; - var skipAnimation = false; - - if (totalActiveAnimations > 0) { - var animationsToCancel = []; - if (!runner.isClassBased) { - if (animationEvent == 'leave' && runningAnimations['ng-leave']) { - skipAnimation = true; - } else { - //cancel all animations when a structural animation takes place - for (var klass in runningAnimations) { - animationsToCancel.push(runningAnimations[klass]); - } - ngAnimateState = {}; - cleanup(element, true); - } - } else if (lastAnimation.event == 'setClass') { - animationsToCancel.push(lastAnimation); - cleanup(element, className); - } else if (runningAnimations[className]) { - var current = runningAnimations[className]; - if (current.event == animationEvent) { - skipAnimation = true; - } else { - animationsToCancel.push(current); - cleanup(element, className); - } - } - - if (animationsToCancel.length > 0) { - forEach(animationsToCancel, function(operation) { - operation.cancel(); - }); - } - } - - if (runner.isClassBased - && !runner.isSetClassOperation - && animationEvent != 'animate' - && !skipAnimation) { - skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR - } - - if (skipAnimation) { - fireDOMOperation(); - fireBeforeCallbackAsync(); - fireAfterCallbackAsync(); - fireDoneCallbackAsync(); - return noopCancel; - } - - runningAnimations = ngAnimateState.active || {}; - totalActiveAnimations = ngAnimateState.totalActive || 0; - - if (animationEvent == 'leave') { - //there's no need to ever remove the listener since the element - //will be removed (destroyed) after the leave animation ends or - //is cancelled midway - element.one('$destroy', function(e) { - var element = angular.element(this); - var state = element.data(NG_ANIMATE_STATE); - if (state) { - var activeLeaveAnimation = state.active['ng-leave']; - if (activeLeaveAnimation) { - activeLeaveAnimation.cancel(); - cleanup(element, 'ng-leave'); - } - } - }); - } - - //the ng-animate class does nothing, but it's here to allow for - //parent animations to find and cancel child animations when needed - $$jqLite.addClass(element, NG_ANIMATE_CLASS_NAME); - if (options && options.tempClasses) { - forEach(options.tempClasses, function(className) { - $$jqLite.addClass(element, className); - }); - } - - var localAnimationCount = globalAnimationCounter++; - totalActiveAnimations++; - runningAnimations[className] = runner; - - element.data(NG_ANIMATE_STATE, { - last: runner, - active: runningAnimations, - index: localAnimationCount, - totalActive: totalActiveAnimations - }); - - //first we run the before animations and when all of those are complete - //then we perform the DOM operation and run the next set of animations - fireBeforeCallbackAsync(); - runner.before(function(cancelled) { - var data = element.data(NG_ANIMATE_STATE); - cancelled = cancelled || - !data || !data.active[className] || - (runner.isClassBased && data.active[className].event != animationEvent); - - fireDOMOperation(); - if (cancelled === true) { - closeAnimation(); - } else { - fireAfterCallbackAsync(); - runner.after(closeAnimation); - } - }); - - return runner.cancel; - - function fireDOMCallback(animationPhase) { - var eventName = '$animate:' + animationPhase; - if (elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) { - $$asyncCallback(function() { - element.triggerHandler(eventName, { - event: animationEvent, - className: className - }); - }); - } - } - - function fireBeforeCallbackAsync() { - fireDOMCallback('before'); - } - - function fireAfterCallbackAsync() { - fireDOMCallback('after'); - } - - function fireDoneCallbackAsync() { - fireDOMCallback('close'); - doneCallback(); - } - - //it is less complicated to use a flag than managing and canceling - //timeouts containing multiple callbacks. - function fireDOMOperation() { - if (!fireDOMOperation.hasBeenRun) { - fireDOMOperation.hasBeenRun = true; - domOperation(); - } - } - - function closeAnimation() { - if (!closeAnimation.hasBeenRun) { - if (runner) { //the runner doesn't exist if it fails to instantiate - runner.applyStyles(); - } - - closeAnimation.hasBeenRun = true; - if (options && options.tempClasses) { - forEach(options.tempClasses, function(className) { - $$jqLite.removeClass(element, className); - }); - } - - var data = element.data(NG_ANIMATE_STATE); - if (data) { - - /* only structural animations wait for reflow before removing an - animation, but class-based animations don't. An example of this - failing would be when a parent HTML tag has a ng-class attribute - causing ALL directives below to skip animations during the digest */ - if (runner && runner.isClassBased) { - cleanup(element, className); - } else { - $$asyncCallback(function() { - var data = element.data(NG_ANIMATE_STATE) || {}; - if (localAnimationCount == data.index) { - cleanup(element, className, animationEvent); - } - }); - element.data(NG_ANIMATE_STATE, data); - } - } - fireDoneCallbackAsync(); - } - } - } - - function cancelChildAnimations(element) { - var node = extractElementNode(element); - if (node) { - var nodes = angular.isFunction(node.getElementsByClassName) ? - node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) : - node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME); - forEach(nodes, function(element) { - element = angular.element(element); - var data = element.data(NG_ANIMATE_STATE); - if (data && data.active) { - forEach(data.active, function(runner) { - runner.cancel(); - }); - } - }); - } - } - - function cleanup(element, className) { - if (isMatchingElement(element, $rootElement)) { - if (!rootAnimateState.disabled) { - rootAnimateState.running = false; - rootAnimateState.structural = false; - } - } else if (className) { - var data = element.data(NG_ANIMATE_STATE) || {}; - - var removeAnimations = className === true; - if (!removeAnimations && data.active && data.active[className]) { - data.totalActive--; - delete data.active[className]; - } - - if (removeAnimations || !data.totalActive) { - $$jqLite.removeClass(element, NG_ANIMATE_CLASS_NAME); - element.removeData(NG_ANIMATE_STATE); - } - } - } - - function animationsDisabled(element, parentElement) { - if (rootAnimateState.disabled) { - return true; - } - - if (isMatchingElement(element, $rootElement)) { - return rootAnimateState.running; - } - - var allowChildAnimations, parentRunningAnimation, hasParent; - do { - //the element did not reach the root element which means that it - //is not apart of the DOM. Therefore there is no reason to do - //any animations on it - if (parentElement.length === 0) break; - - var isRoot = isMatchingElement(parentElement, $rootElement); - var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {}); - if (state.disabled) { - return true; - } - - //no matter what, for an animation to work it must reach the root element - //this implies that the element is attached to the DOM when the animation is run - if (isRoot) { - hasParent = true; - } - - //once a flag is found that is strictly false then everything before - //it will be discarded and all child animations will be restricted - if (allowChildAnimations !== false) { - var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN); - if (angular.isDefined(animateChildrenFlag)) { - allowChildAnimations = animateChildrenFlag; - } - } - - parentRunningAnimation = parentRunningAnimation || - state.running || - (state.last && !state.last.isClassBased); - } - while (parentElement = parentElement.parent()); - - return !hasParent || (!allowChildAnimations && parentRunningAnimation); - } - }]); - - $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow', - function($window, $sniffer, $timeout, $$animateReflow) { - // Detect proper transitionend/animationend event names. - var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; - - // If unprefixed events are not supported but webkit-prefixed are, use the latter. - // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. - // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` - // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. - // Register both events in case `window.onanimationend` is not supported because of that, - // do the same for `transitionend` as Safari is likely to exhibit similar behavior. - // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit - // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition - if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) { - CSS_PREFIX = '-webkit-'; - TRANSITION_PROP = 'WebkitTransition'; - TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; - } else { - TRANSITION_PROP = 'transition'; - TRANSITIONEND_EVENT = 'transitionend'; - } - - if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) { - CSS_PREFIX = '-webkit-'; - ANIMATION_PROP = 'WebkitAnimation'; - ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; - } else { - ANIMATION_PROP = 'animation'; - ANIMATIONEND_EVENT = 'animationend'; - } - - var DURATION_KEY = 'Duration'; - var PROPERTY_KEY = 'Property'; - var DELAY_KEY = 'Delay'; - var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; - var ANIMATION_PLAYSTATE_KEY = 'PlayState'; - var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey'; - var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data'; - var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; - var CLOSING_TIME_BUFFER = 1.5; - var ONE_SECOND = 1000; - - var lookupCache = {}; - var parentCounter = 0; - var animationReflowQueue = []; - var cancelAnimationReflow; - function clearCacheAfterReflow() { - if (!cancelAnimationReflow) { - cancelAnimationReflow = $$animateReflow(function() { - animationReflowQueue = []; - cancelAnimationReflow = null; - lookupCache = {}; - }); - } - } - - function afterReflow(element, callback) { - if (cancelAnimationReflow) { - cancelAnimationReflow(); - } - animationReflowQueue.push(callback); - cancelAnimationReflow = $$animateReflow(function() { - forEach(animationReflowQueue, function(fn) { - fn(); - }); - - animationReflowQueue = []; - cancelAnimationReflow = null; - lookupCache = {}; - }); - } - - var closingTimer = null; - var closingTimestamp = 0; - var animationElementQueue = []; - function animationCloseHandler(element, totalTime) { - var node = extractElementNode(element); - element = angular.element(node); - - //this item will be garbage collected by the closing - //animation timeout - animationElementQueue.push(element); - - //but it may not need to cancel out the existing timeout - //if the timestamp is less than the previous one - var futureTimestamp = Date.now() + totalTime; - if (futureTimestamp <= closingTimestamp) { - return; - } - - $timeout.cancel(closingTimer); - - closingTimestamp = futureTimestamp; - closingTimer = $timeout(function() { - closeAllAnimations(animationElementQueue); - animationElementQueue = []; - }, totalTime, false); - } - - function closeAllAnimations(elements) { - forEach(elements, function(element) { - var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); - if (elementData) { - forEach(elementData.closeAnimationFns, function(fn) { - fn(); - }); - } - }); - } - - function getElementAnimationDetails(element, cacheKey) { - var data = cacheKey ? lookupCache[cacheKey] : null; - if (!data) { - var transitionDuration = 0; - var transitionDelay = 0; - var animationDuration = 0; - var animationDelay = 0; - - //we want all the styles defined before and after - forEach(element, function(element) { - if (element.nodeType == ELEMENT_NODE) { - var elementStyles = $window.getComputedStyle(element) || {}; - - var transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY]; - transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration); - - var transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY]; - transitionDelay = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay); - - var animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY]; - animationDelay = Math.max(parseMaxTime(elementStyles[ANIMATION_PROP + DELAY_KEY]), animationDelay); - - var aDuration = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]); - - if (aDuration > 0) { - aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1; - } - animationDuration = Math.max(aDuration, animationDuration); - } - }); - data = { - total: 0, - transitionDelay: transitionDelay, - transitionDuration: transitionDuration, - animationDelay: animationDelay, - animationDuration: animationDuration - }; - if (cacheKey) { - lookupCache[cacheKey] = data; - } - } - return data; - } - - function parseMaxTime(str) { - var maxValue = 0; - var values = isString(str) ? - str.split(/\s*,\s*/) : - []; - forEach(values, function(value) { - maxValue = Math.max(parseFloat(value) || 0, maxValue); - }); - return maxValue; - } - - function getCacheKey(element) { - var parentElement = element.parent(); - var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY); - if (!parentID) { - parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter); - parentID = parentCounter; - } - return parentID + '-' + extractElementNode(element).getAttribute('class'); - } - - function animateSetup(animationEvent, element, className, styles) { - var structural = ['ng-enter','ng-leave','ng-move'].indexOf(className) >= 0; - - var cacheKey = getCacheKey(element); - var eventCacheKey = cacheKey + ' ' + className; - var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0; - - var stagger = {}; - if (itemIndex > 0) { - var staggerClassName = className + '-stagger'; - var staggerCacheKey = cacheKey + ' ' + staggerClassName; - var applyClasses = !lookupCache[staggerCacheKey]; - - applyClasses && $$jqLite.addClass(element, staggerClassName); - - stagger = getElementAnimationDetails(element, staggerCacheKey); - - applyClasses && $$jqLite.removeClass(element, staggerClassName); - } - - $$jqLite.addClass(element, className); - - var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {}; - var timings = getElementAnimationDetails(element, eventCacheKey); - var transitionDuration = timings.transitionDuration; - var animationDuration = timings.animationDuration; - - if (structural && transitionDuration === 0 && animationDuration === 0) { - $$jqLite.removeClass(element, className); - return false; - } - - var blockTransition = styles || (structural && transitionDuration > 0); - var blockAnimation = animationDuration > 0 && - stagger.animationDelay > 0 && - stagger.animationDuration === 0; - - var closeAnimationFns = formerData.closeAnimationFns || []; - element.data(NG_ANIMATE_CSS_DATA_KEY, { - stagger: stagger, - cacheKey: eventCacheKey, - running: formerData.running || 0, - itemIndex: itemIndex, - blockTransition: blockTransition, - closeAnimationFns: closeAnimationFns - }); - - var node = extractElementNode(element); - - if (blockTransition) { - blockTransitions(node, true); - if (styles) { - element.css(styles); - } - } - - if (blockAnimation) { - blockAnimations(node, true); - } - - return true; - } - - function animateRun(animationEvent, element, className, activeAnimationComplete, styles) { - var node = extractElementNode(element); - var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); - if (node.getAttribute('class').indexOf(className) == -1 || !elementData) { - activeAnimationComplete(); - return; - } - - var activeClassName = ''; - var pendingClassName = ''; - forEach(className.split(' '), function(klass, i) { - var prefix = (i > 0 ? ' ' : '') + klass; - activeClassName += prefix + '-active'; - pendingClassName += prefix + '-pending'; - }); - - var style = ''; - var appliedStyles = []; - var itemIndex = elementData.itemIndex; - var stagger = elementData.stagger; - var staggerTime = 0; - if (itemIndex > 0) { - var transitionStaggerDelay = 0; - if (stagger.transitionDelay > 0 && stagger.transitionDuration === 0) { - transitionStaggerDelay = stagger.transitionDelay * itemIndex; - } - - var animationStaggerDelay = 0; - if (stagger.animationDelay > 0 && stagger.animationDuration === 0) { - animationStaggerDelay = stagger.animationDelay * itemIndex; - appliedStyles.push(CSS_PREFIX + 'animation-play-state'); - } - - staggerTime = Math.round(Math.max(transitionStaggerDelay, animationStaggerDelay) * 100) / 100; - } - - if (!staggerTime) { - $$jqLite.addClass(element, activeClassName); - if (elementData.blockTransition) { - blockTransitions(node, false); - } - } - - var eventCacheKey = elementData.cacheKey + ' ' + activeClassName; - var timings = getElementAnimationDetails(element, eventCacheKey); - var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration); - if (maxDuration === 0) { - $$jqLite.removeClass(element, activeClassName); - animateClose(element, className); - activeAnimationComplete(); - return; - } - - if (!staggerTime && styles && Object.keys(styles).length > 0) { - if (!timings.transitionDuration) { - element.css('transition', timings.animationDuration + 's linear all'); - appliedStyles.push('transition'); - } - element.css(styles); - } - - var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay); - var maxDelayTime = maxDelay * ONE_SECOND; - - if (appliedStyles.length > 0) { - //the element being animated may sometimes contain comment nodes in - //the jqLite object, so we're safe to use a single variable to house - //the styles since there is always only one element being animated - var oldStyle = node.getAttribute('style') || ''; - if (oldStyle.charAt(oldStyle.length - 1) !== ';') { - oldStyle += ';'; - } - node.setAttribute('style', oldStyle + ' ' + style); - } - - var startTime = Date.now(); - var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT; - var animationTime = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER; - var totalTime = (staggerTime + animationTime) * ONE_SECOND; - - var staggerTimeout; - if (staggerTime > 0) { - $$jqLite.addClass(element, pendingClassName); - staggerTimeout = $timeout(function() { - staggerTimeout = null; - - if (timings.transitionDuration > 0) { - blockTransitions(node, false); - } - if (timings.animationDuration > 0) { - blockAnimations(node, false); - } - - $$jqLite.addClass(element, activeClassName); - $$jqLite.removeClass(element, pendingClassName); - - if (styles) { - if (timings.transitionDuration === 0) { - element.css('transition', timings.animationDuration + 's linear all'); - } - element.css(styles); - appliedStyles.push('transition'); - } - }, staggerTime * ONE_SECOND, false); - } - - element.on(css3AnimationEvents, onAnimationProgress); - elementData.closeAnimationFns.push(function() { - onEnd(); - activeAnimationComplete(); - }); - - elementData.running++; - animationCloseHandler(element, totalTime); - return onEnd; - - // This will automatically be called by $animate so - // there is no need to attach this internally to the - // timeout done method. - function onEnd() { - element.off(css3AnimationEvents, onAnimationProgress); - $$jqLite.removeClass(element, activeClassName); - $$jqLite.removeClass(element, pendingClassName); - if (staggerTimeout) { - $timeout.cancel(staggerTimeout); - } - animateClose(element, className); - var node = extractElementNode(element); - for (var i in appliedStyles) { - node.style.removeProperty(appliedStyles[i]); - } - } - - function onAnimationProgress(event) { - event.stopPropagation(); - var ev = event.originalEvent || event; - var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now(); - - /* Firefox (or possibly just Gecko) likes to not round values up - * when a ms measurement is used for the animation */ - var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); - - /* $manualTimeStamp is a mocked timeStamp value which is set - * within browserTrigger(). This is only here so that tests can - * mock animations properly. Real events fallback to event.timeStamp, - * or, if they don't, then a timeStamp is automatically created for them. - * We're checking to see if the timeStamp surpasses the expected delay, - * but we're using elapsedTime instead of the timeStamp on the 2nd - * pre-condition since animations sometimes close off early */ - if (Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { - activeAnimationComplete(); - } - } - } - - function blockTransitions(node, bool) { - node.style[TRANSITION_PROP + PROPERTY_KEY] = bool ? 'none' : ''; - } - - function blockAnimations(node, bool) { - node.style[ANIMATION_PROP + ANIMATION_PLAYSTATE_KEY] = bool ? 'paused' : ''; - } - - function animateBefore(animationEvent, element, className, styles) { - if (animateSetup(animationEvent, element, className, styles)) { - return function(cancelled) { - cancelled && animateClose(element, className); - }; - } - } - - function animateAfter(animationEvent, element, className, afterAnimationComplete, styles) { - if (element.data(NG_ANIMATE_CSS_DATA_KEY)) { - return animateRun(animationEvent, element, className, afterAnimationComplete, styles); - } else { - animateClose(element, className); - afterAnimationComplete(); - } - } - - function animate(animationEvent, element, className, animationComplete, options) { - //If the animateSetup function doesn't bother returning a - //cancellation function then it means that there is no animation - //to perform at all - var preReflowCancellation = animateBefore(animationEvent, element, className, options.from); - if (!preReflowCancellation) { - clearCacheAfterReflow(); - animationComplete(); - return; - } - - //There are two cancellation functions: one is before the first - //reflow animation and the second is during the active state - //animation. The first function will take care of removing the - //data from the element which will not make the 2nd animation - //happen in the first place - var cancel = preReflowCancellation; - afterReflow(element, function() { - //once the reflow is complete then we point cancel to - //the new cancellation function which will remove all of the - //animation properties from the active animation - cancel = animateAfter(animationEvent, element, className, animationComplete, options.to); - }); - - return function(cancelled) { - (cancel || noop)(cancelled); - }; - } - - function animateClose(element, className) { - $$jqLite.removeClass(element, className); - var data = element.data(NG_ANIMATE_CSS_DATA_KEY); - if (data) { - if (data.running) { - data.running--; - } - if (!data.running || data.running === 0) { - element.removeData(NG_ANIMATE_CSS_DATA_KEY); - } - } - } - - return { - animate: function(element, className, from, to, animationCompleted, options) { - options = options || {}; - options.from = from; - options.to = to; - return animate('animate', element, className, animationCompleted, options); - }, - - enter: function(element, animationCompleted, options) { - options = options || {}; - return animate('enter', element, 'ng-enter', animationCompleted, options); - }, - - leave: function(element, animationCompleted, options) { - options = options || {}; - return animate('leave', element, 'ng-leave', animationCompleted, options); - }, - - move: function(element, animationCompleted, options) { - options = options || {}; - return animate('move', element, 'ng-move', animationCompleted, options); - }, - - beforeSetClass: function(element, add, remove, animationCompleted, options) { - options = options || {}; - var className = suffixClasses(remove, '-remove') + ' ' + - suffixClasses(add, '-add'); - var cancellationMethod = animateBefore('setClass', element, className, options.from); - if (cancellationMethod) { - afterReflow(element, animationCompleted); - return cancellationMethod; - } - clearCacheAfterReflow(); - animationCompleted(); - }, - - beforeAddClass: function(element, className, animationCompleted, options) { - options = options || {}; - var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'), options.from); - if (cancellationMethod) { - afterReflow(element, animationCompleted); - return cancellationMethod; - } - clearCacheAfterReflow(); - animationCompleted(); - }, - - beforeRemoveClass: function(element, className, animationCompleted, options) { - options = options || {}; - var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'), options.from); - if (cancellationMethod) { - afterReflow(element, animationCompleted); - return cancellationMethod; - } - clearCacheAfterReflow(); - animationCompleted(); - }, - - setClass: function(element, add, remove, animationCompleted, options) { - options = options || {}; - remove = suffixClasses(remove, '-remove'); - add = suffixClasses(add, '-add'); - var className = remove + ' ' + add; - return animateAfter('setClass', element, className, animationCompleted, options.to); - }, - - addClass: function(element, className, animationCompleted, options) { - options = options || {}; - return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted, options.to); - }, - - removeClass: function(element, className, animationCompleted, options) { - options = options || {}; - return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted, options.to); - } - }; - - function suffixClasses(classes, suffix) { - var className = ''; - classes = isArray(classes) ? classes : classes.split(/\s+/); - forEach(classes, function(klass, i) { - if (klass && klass.length > 0) { - className += (i > 0 ? ' ' : '') + klass + suffix; - } - }); - return className; - } - }]); - }]); - - -})(window, window.angular); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-animate_1.3.13/angular-animate.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-animate_1.3.13/angular-animate.min.js deleted file mode 100644 index 6ed98ee6..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-animate_1.3.13/angular-animate.min.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - AngularJS v1.3.13 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(N,f,W){'use strict';f.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(X,C,g){g=g.ngAnimateChildren;f.isString(g)&&0===g.length?C.data("$$ngAnimateChildren",!0):X.$watch(g,function(f){C.data("$$ngAnimateChildren",!!f)})}}).factory("$$animateReflow",["$$rAF","$document",function(f,C){return function(g){return f(function(){g()})}}]).config(["$provide","$animateProvider",function(X,C){function g(f){for(var n=0;n=C&&b>=x&&c()}var m=g(e);a=e.data("$$ngAnimateCSS3Data");if(-1!=m.getAttribute("class").indexOf(b)&&a){var k="",t="";n(b.split(" "),function(a, -b){var e=(0
- * - * See {@link ngCookies.$cookies `$cookies`} and - * {@link ngCookies.$cookieStore `$cookieStore`} for usage. - */ - - -angular.module('ngCookies', ['ng']). - /** - * @ngdoc service - * @name $cookies - * - * @description - * Provides read/write access to browser's cookies. - * - * Only a simple Object is exposed and by adding or removing properties to/from this object, new - * cookies are created/deleted at the end of current $eval. - * The object's properties can only be strings. - * - * Requires the {@link ngCookies `ngCookies`} module to be installed. - * - * @example - * - * ```js - * angular.module('cookiesExample', ['ngCookies']) - * .controller('ExampleController', ['$cookies', function($cookies) { - * // Retrieving a cookie - * var favoriteCookie = $cookies.myFavorite; - * // Setting a cookie - * $cookies.myFavorite = 'oatmeal'; - * }]); - * ``` - */ - factory('$cookies', ['$rootScope', '$browser', function($rootScope, $browser) { - var cookies = {}, - lastCookies = {}, - lastBrowserCookies, - runEval = false, - copy = angular.copy, - isUndefined = angular.isUndefined; - - //creates a poller fn that copies all cookies from the $browser to service & inits the service - $browser.addPollFn(function() { - var currentCookies = $browser.cookies(); - if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl - lastBrowserCookies = currentCookies; - copy(currentCookies, lastCookies); - copy(currentCookies, cookies); - if (runEval) $rootScope.$apply(); - } - })(); - - runEval = true; - - //at the end of each eval, push cookies - //TODO: this should happen before the "delayed" watches fire, because if some cookies are not - // strings or browser refuses to store some cookies, we update the model in the push fn. - $rootScope.$watch(push); - - return cookies; - - - /** - * Pushes all the cookies from the service to the browser and verifies if all cookies were - * stored. - */ - function push() { - var name, - value, - browserCookies, - updated; - - //delete any cookies deleted in $cookies - for (name in lastCookies) { - if (isUndefined(cookies[name])) { - $browser.cookies(name, undefined); - } - } - - //update all cookies updated in $cookies - for (name in cookies) { - value = cookies[name]; - if (!angular.isString(value)) { - value = '' + value; - cookies[name] = value; - } - if (value !== lastCookies[name]) { - $browser.cookies(name, value); - updated = true; - } - } - - //verify what was actually stored - if (updated) { - updated = false; - browserCookies = $browser.cookies(); - - for (name in cookies) { - if (cookies[name] !== browserCookies[name]) { - //delete or reset all cookies that the browser dropped from $cookies - if (isUndefined(browserCookies[name])) { - delete cookies[name]; - } else { - cookies[name] = browserCookies[name]; - } - updated = true; - } - } - } - } - }]). - - - /** - * @ngdoc service - * @name $cookieStore - * @requires $cookies - * - * @description - * Provides a key-value (string-object) storage, that is backed by session cookies. - * Objects put or retrieved from this storage are automatically serialized or - * deserialized by angular's toJson/fromJson. - * - * Requires the {@link ngCookies `ngCookies`} module to be installed. - * - * @example - * - * ```js - * angular.module('cookieStoreExample', ['ngCookies']) - * .controller('ExampleController', ['$cookieStore', function($cookieStore) { - * // Put cookie - * $cookieStore.put('myFavorite','oatmeal'); - * // Get cookie - * var favoriteCookie = $cookieStore.get('myFavorite'); - * // Removing a cookie - * $cookieStore.remove('myFavorite'); - * }]); - * ``` - */ - factory('$cookieStore', ['$cookies', function($cookies) { - - return { - /** - * @ngdoc method - * @name $cookieStore#get - * - * @description - * Returns the value of given cookie key - * - * @param {string} key Id to use for lookup. - * @returns {Object} Deserialized cookie value. - */ - get: function(key) { - var value = $cookies[key]; - return value ? angular.fromJson(value) : value; - }, - - /** - * @ngdoc method - * @name $cookieStore#put - * - * @description - * Sets a value for given cookie key - * - * @param {string} key Id for the `value`. - * @param {Object} value Value to be stored. - */ - put: function(key, value) { - $cookies[key] = angular.toJson(value); - }, - - /** - * @ngdoc method - * @name $cookieStore#remove - * - * @description - * Remove given cookie - * - * @param {string} key Id of the key-value pair to delete. - */ - remove: function(key) { - delete $cookies[key]; - } - }; - - }]); - - -})(window, window.angular); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-cookies_1.3.13/angular-cookies.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-cookies_1.3.13/angular-cookies.min.js deleted file mode 100644 index 2d81fd37..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-cookies_1.3.13/angular-cookies.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - AngularJS v1.3.13 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(p,f,n){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(e,b){var c={},g={},h,k=!1,l=f.copy,m=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,l(a,g),l(a,c),k&&e.$apply())})();k=!0;e.$watch(function(){var a,d,e;for(a in g)m(c[a])&&b.cookies(a,n);for(a in c)d=c[a],f.isString(d)||(d=""+d,c[a]=d),d!==g[a]&&(b.cookies(a,d),e=!0);if(e)for(a in d=b.cookies(),c)c[a]!==d[a]&&(m(d[a])?delete c[a]:c[a]=d[a])});return c}]).factory("$cookieStore", -["$cookies",function(e){return{get:function(b){return(b=e[b])?f.fromJson(b):b},put:function(b,c){e[b]=f.toJson(c)},remove:function(b){delete e[b]}}}])})(window,window.angular); -//# sourceMappingURL=angular-cookies.min.js.map diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-cookies_1.3.13/angular-cookies.min.js.map b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-cookies_1.3.13/angular-cookies.min.js.map deleted file mode 100644 index 677960c5..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-cookies_1.3.13/angular-cookies.min.js.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"angular-cookies.min.js", -"lineCount":7, -"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAmBtCD,CAAAE,OAAA,CAAe,WAAf,CAA4B,CAAC,IAAD,CAA5B,CAAAC,QAAA,CA0BW,UA1BX,CA0BuB,CAAC,YAAD,CAAe,UAAf,CAA2B,QAAQ,CAACC,CAAD,CAAaC,CAAb,CAAuB,CAAA,IACvEC,EAAU,EAD6D,CAEvEC,EAAc,EAFyD,CAGvEC,CAHuE,CAIvEC,EAAU,CAAA,CAJ6D,CAKvEC,EAAOV,CAAAU,KALgE,CAMvEC,EAAcX,CAAAW,YAGlBN,EAAAO,UAAA,CAAmB,QAAQ,EAAG,CAC5B,IAAIC,EAAiBR,CAAAC,QAAA,EACjBE,EAAJ,EAA0BK,CAA1B,GACEL,CAGA,CAHqBK,CAGrB,CAFAH,CAAA,CAAKG,CAAL,CAAqBN,CAArB,CAEA,CADAG,CAAA,CAAKG,CAAL,CAAqBP,CAArB,CACA,CAAIG,CAAJ,EAAaL,CAAAU,OAAA,EAJf,CAF4B,CAA9B,CAAA,EAUAL,EAAA,CAAU,CAAA,CAKVL,EAAAW,OAAA,CASAC,QAAa,EAAG,CAAA,IACVC,CADU,CAEVC,CAFU,CAIVC,CAGJ,KAAKF,CAAL,GAAaV,EAAb,CACMI,CAAA,CAAYL,CAAA,CAAQW,CAAR,CAAZ,CAAJ,EACEZ,CAAAC,QAAA,CAAiBW,CAAjB,CAAuBhB,CAAvB,CAKJ,KAAKgB,CAAL,GAAaX,EAAb,CACEY,CAKA,CALQZ,CAAA,CAAQW,CAAR,CAKR,CAJKjB,CAAAoB,SAAA,CAAiBF,CAAjB,CAIL,GAHEA,CACA,CADQ,EACR,CADaA,CACb,CAAAZ,CAAA,CAAQW,CAAR,CAAA,CAAgBC,CAElB,EAAIA,CAAJ,GAAcX,CAAA,CAAYU,CAAZ,CAAd,GACEZ,CAAAC,QAAA,CAAiBW,CAAjB,CAAuBC,CAAvB,CACA,CAAAC,CAAA,CAAU,CAAA,CAFZ,CAOF,IAAIA,CAAJ,CAIE,IAAKF,CAAL,GAFAI,EAEaf,CAFID,CAAAC,QAAA,EAEJA,CAAAA,CAAb,CACMA,CAAA,CAAQW,CAAR,CAAJ,GAAsBI,CAAA,CAAeJ,CAAf,CAAtB,GAEMN,CAAA,CAAYU,CAAA,CAAeJ,CAAf,CAAZ,CAAJ,CACE,OAAOX,CAAA,CAAQW,CAAR,CADT,CAGEX,CAAA,CAAQW,CAAR,CAHF,CAGkBI,CAAA,CAAeJ,CAAf,CALpB,CAhCU,CAThB,CAEA,OAAOX,EA1BoE,CAA1D,CA1BvB,CAAAH,QAAA,CAoIW,cApIX;AAoI2B,CAAC,UAAD,CAAa,QAAQ,CAACmB,CAAD,CAAW,CAErD,MAAO,CAWLC,IAAKA,QAAQ,CAACC,CAAD,CAAM,CAEjB,MAAO,CADHN,CACG,CADKI,CAAA,CAASE,CAAT,CACL,EAAQxB,CAAAyB,SAAA,CAAiBP,CAAjB,CAAR,CAAkCA,CAFxB,CAXd,CA0BLQ,IAAKA,QAAQ,CAACF,CAAD,CAAMN,CAAN,CAAa,CACxBI,CAAA,CAASE,CAAT,CAAA,CAAgBxB,CAAA2B,OAAA,CAAeT,CAAf,CADQ,CA1BrB,CAuCLU,OAAQA,QAAQ,CAACJ,CAAD,CAAM,CACpB,OAAOF,CAAA,CAASE,CAAT,CADa,CAvCjB,CAF8C,CAAhC,CApI3B,CAnBsC,CAArC,CAAD,CAwMGzB,MAxMH,CAwMWA,MAAAC,QAxMX;", -"sources":["angular-cookies.js"], -"names":["window","angular","undefined","module","factory","$rootScope","$browser","cookies","lastCookies","lastBrowserCookies","runEval","copy","isUndefined","addPollFn","currentCookies","$apply","$watch","push","name","value","updated","isString","browserCookies","$cookies","get","key","fromJson","put","toJson","remove"] -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-drag-and-drop-lists_1.2.0/angular-drag-and-drop-lists.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-drag-and-drop-lists_1.2.0/angular-drag-and-drop-lists.js deleted file mode 100644 index e496fd4c..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-drag-and-drop-lists_1.2.0/angular-drag-and-drop-lists.js +++ /dev/null @@ -1,501 +0,0 @@ -/** - * angular-drag-and-drop-lists v1.2.0 - * - * Copyright (c) 2014 Marcel Juenemann mail@marcel-junemann.de - * https://github.com/marceljuenemann/angular-drag-and-drop-lists - * - * License: MIT - */ -angular.module('dndLists', []) - - /** - * Use the dnd-draggable attribute to make your element draggable - * - * Attributes: - * - dnd-draggable Required attribute. The value has to be an object that represents the data - * of the element. In case of a drag and drop operation the object will be - * serialized and unserialized on the receiving end. - * - dnd-selected Callback that is invoked when the element was clicked but not dragged. - * The original click event will be provided in the local event variable. - * - dnd-effect-allowed Use this attribute to limit the operations that can be performed. Options: - * - "move": The drag operation will move the element. This is the default. - * - "copy": The drag operation will copy the element. Shows a copy cursor. - * - "copyMove": The user can choose between copy and move by pressing the - * ctrl or shift key. *Not supported in IE:* In Internet Explorer this - * option will be the same as "copy". *Not fully supported in Chrome on - * Windows:* In the Windows version of Chrome the cursor will always be the - * move cursor. However, when the user drops an element and has the ctrl - * key pressed, we will perform a copy anyways. - * - HTML5 also specifies the "link" option, but this library does not - * actively support it yet, so use it at your own risk. - * - dnd-moved Callback that is invoked when the element was moved. Usually you will - * remove your element from the original list in this callback, since the - * directive is not doing that for you automatically. The original dragend - * event will be provided in the local event variable. - * - dnd-copied Same as dnd-moved, just that it is called when the element was copied - * instead of moved. The original dragend event will be provided in the local - * event variable. - * - dnd-dragstart Callback that is invoked when the element was dragged. The original - * dragstart event will be provided in the local event variable. - * - dnd-type Use this attribute if you have different kinds of items in your - * application and you want to limit which items can be dropped into which - * lists. Combine with dnd-allowed-types on the dnd-list(s). This attribute - * should evaluate to a string, although this restriction is not enforced. - * - dnd-disable-if You can use this attribute to dynamically disable the draggability of the - * element. This is useful if you have certain list items that you don't want - * to be draggable, or if you want to disable drag & drop completely without - * having two different code branches (e.g. only allow for admins). - * **Note**: If your element is not draggable, the user is probably able to - * select text or images inside of it. Since a selection is always draggable, - * this breaks your UI. You most likely want to disable user selection via - * CSS (see user-select). - * - * CSS classes: - * - dndDragging This class will be added to the element while the element is being - * dragged. It will affect both the element you see while dragging and the - * source element that stays at it's position. Do not try to hide the source - * element with this class, because that will abort the drag operation. - * - dndDraggingSource This class will be added to the element after the drag operation was - * started, meaning it only affects the original element that is still at - * it's source position, and not the "element" that the user is dragging with - * his mouse pointer. - */ - .directive('dndDraggable', ['$parse', '$timeout', 'dndDropEffectWorkaround', 'dndDragTypeWorkaround', - function($parse, $timeout, dndDropEffectWorkaround, dndDragTypeWorkaround) { - return function(scope, element, attr) { - // Set the HTML5 draggable attribute on the element - element.attr("draggable", "true"); - - // If the dnd-disable-if attribute is set, we have to watch that - if (attr.dndDisableIf) { - scope.$watch(attr.dndDisableIf, function(disabled) { - element.attr("draggable", !disabled); - }); - } - - /** - * When the drag operation is started we have to prepare the dataTransfer object, - * which is the primary way we communicate with the target element - */ - element.on('dragstart', function(event) { - event = event.originalEvent || event; - - // Serialize the data associated with this element. IE only supports the Text drag type - event.dataTransfer.setData("Text", angular.toJson(scope.$eval(attr.dndDraggable))); - - // Only allow actions specified in dnd-effect-allowed attribute - event.dataTransfer.effectAllowed = attr.dndEffectAllowed || "move"; - - // Add CSS classes. See documentation above - element.addClass("dndDragging"); - - // Workarounds for stupid browsers, see description below - dndDropEffectWorkaround.dropEffect = "none"; - dndDragTypeWorkaround.isDragging = true; - - // - // This code was originally placed after element.addClass. - // This timeout is invoked after the 'dragend' event in IE9 (at leats on slooow virtual box) - // and since this class is used to hide elements it seems like the element is gone, - // therefor make sure the dragging still is happening when adding this class - $timeout(function() { - // Flowable This code - if (dndDragTypeWorkaround.isDragging) { - element.addClass("dndDraggingSource"); - } - }, 0); - // - - // Save type of item in global state. Usually, this would go into the dataTransfer - // typename, but we have to use "Text" there to support IE - dndDragTypeWorkaround.dragType = attr.dndType ? scope.$eval(attr.dndType) : undefined; - - // Invoke callback - $parse(attr.dndDragstart)(scope, {event: event}); - - event.stopPropagation(); - }); - - /** - * The dragend event is triggered when the element was dropped or when the drag - * operation was aborted (e.g. hit escape button). Depending on the executed action - * we will invoke the callbacks specified with the dnd-moved or dnd-copied attribute. - */ - element.on('dragend', function(event) { - event = event.originalEvent || event; - - // Invoke callbacks. Usually we would use event.dataTransfer.dropEffect to determine - // the used effect, but Chrome has not implemented that field correctly. On Windows - // it always sets it to 'none', while Chrome on Linux sometimes sets it to something - // else when it's supposed to send 'none' (drag operation aborted). - var dropEffect = dndDropEffectWorkaround.dropEffect; - scope.$apply(function() { - switch (dropEffect) { - case "move": - $parse(attr.dndMoved)(scope, {event: event}); - break; - - case "copy": - $parse(attr.dndCopied)(scope, {event: event}); - break; - } - }); - - // Clean up - element.removeClass("dndDragging"); - element.removeClass("dndDraggingSource"); - dndDragTypeWorkaround.isDragging = false; - event.stopPropagation(); - }); - - /** - * When the element is clicked we invoke the callback function - * specified with the dnd-selected attribute. - */ - element.on('click', function(event) { - event = event.originalEvent || event; - - scope.$apply(function() { - $parse(attr.dndSelected)(scope, {event: event}); - }); - - event.stopPropagation(); - }); - - /** - * Workaround to make element draggable in IE9 - */ - element.on('selectstart', function() { - if (this.dragDrop) this.dragDrop(); - return false; - }); - }; - }]) - - /** - * Use the dnd-list attribute to make your list element a dropzone. Usually you will add a single - * li element as child with the ng-repeat directive. If you don't do that, we will not be able to - * position the dropped element correctly. If you want your list to be sortable, also add the - * dnd-draggable directive to your li element(s). Both the dnd-list and it's direct children must - * have position: relative CSS style, otherwise the positioning algorithm will not be able to - * determine the correct placeholder position in all browsers. - * - * Attributes: - * - dnd-list Required attribute. The value has to be the array in which the data of - * the dropped element should be inserted. - * - dnd-allowed-types Optional array of allowed item types. When used, only items that had a - * matching dnd-type attribute will be dropable. - * - dnd-disable-if Optional boolean expresssion. When it evaluates to true, no dropping - * into the list is possible. Note that this also disables rearranging - * items inside the list. - * - dnd-horizontal-list Optional boolean expresssion. When it evaluates to true, the positioning - * algorithm will use the left and right halfs of the list items instead of - * the upper and lower halfs. - * - dnd-dragover Optional expression that is invoked when an element is dragged over the - * list. If the expression is set, but does not return true, the element is - * not allowed to be dropped. The following variables will be available: - * - event: The original dragover event sent by the browser. - * - index: The position in the list at which the element would be dropped. - * - type: The dnd-type set on the dnd-draggable, or undefined if unset. - * - dnd-drop Optional expression that is invoked when an element is dropped over the - * list. If the expression is set, it must return the object that will be - * inserted into the list. If it returns false, the drop will be aborted - * and the event is propagated. The following variables will be available: - * - event: The original drop event sent by the browser. - * - index: The position in the list at which the element would be dropped. - * - item: The transferred object. - * - type: The dnd-type set on the dnd-draggable, or undefined if unset. - * - dnd-external-sources Optional boolean expression. When it evaluates to true, the list accepts - * drops from sources outside of the current browser tab. This allows to - * drag and drop accross different browser tabs. Note that this will allow - * to drop arbitrary text into the list, thus it is highly recommended to - * implement the dnd-drop callback to check the incoming element for - * sanity. Furthermore, the dnd-type of external sources can not be - * determined, therefore do not rely on restrictions of dnd-allowed-type. - * - * CSS classes: - * - dndPlaceholder When an element is dragged over the list, a new placeholder child - * element will be added. This element is of type li and has the class - * dndPlaceholder set. - * - dndDragover Will be added to the list while an element is dragged over the list. - */ - .directive('dndList', ['$parse', '$timeout', 'dndDropEffectWorkaround', 'dndDragTypeWorkaround', - function($parse, $timeout, dndDropEffectWorkaround, dndDragTypeWorkaround) { - return function(scope, element, attr) { - // While an element is dragged over the list, this placeholder element is inserted - // at the location where the element would be inserted after dropping - var placeholder = angular.element("
  • "); - var placeholderNode = placeholder[0]; - var listNode = element[0]; - - var horizontal = attr.dndHorizontalList && scope.$eval(attr.dndHorizontalList); - var externalSources = attr.dndExternalSources && scope.$eval(attr.dndExternalSources); - - /** - * The dragover event is triggered "every few hundred milliseconds" while an element - * is being dragged over our list, or over an child element. - */ - element.on('dragover', function(event) { - event = event.originalEvent || event; - - if (!isDropAllowed(event)) { - return true; - } - - // First of all, make sure that the placeholder is shown - // This is especially important if the list is empty - if (placeholderNode.parentNode != listNode) { - element.append(placeholder); - } - - if (event.target !== listNode) { - // Try to find the node direct directly below the list node. - var listItemNode = event.target; - while (listItemNode.parentNode !== listNode && listItemNode.parentNode) { - listItemNode = listItemNode.parentNode; - } - - if (listItemNode.parentNode === listNode && listItemNode !== placeholderNode) { - // If the mouse pointer is in the upper half of the child element, - // we place it before the child element, otherwise below it. - if (isMouseInFirstHalf(event, listItemNode)) { - listNode.insertBefore(placeholderNode, listItemNode); - } else { - listNode.insertBefore(placeholderNode, listItemNode.nextSibling); - } - } - } else { - // This branch is reached when we are dragging directly over the list element. - // Usually we wouldn't need to do anything here, but the IE does not fire it's - // events for the child element, only for the list directly. Therefore we repeat - // the positioning algorithm for IE here. - if (isMouseInFirstHalf(event, placeholderNode, true)) { - // Check if we should move the placeholder element one spot towards the top. - // Note that display none elements will have offsetTop and offsetHeight set to - // zero, therefore we need a special check for them. - while (placeholderNode.previousElementSibling - && (isMouseInFirstHalf(event, placeholderNode.previousElementSibling, true) - || placeholderNode.previousElementSibling.offsetHeight === 0)) { - listNode.insertBefore(placeholderNode, placeholderNode.previousElementSibling); - } - } else { - // Check if we should move the placeholder element one spot towards the bottom - while (placeholderNode.nextElementSibling && - !isMouseInFirstHalf(event, placeholderNode.nextElementSibling, true)) { - listNode.insertBefore(placeholderNode, - placeholderNode.nextElementSibling.nextElementSibling); - } - } - } - - // At this point we invoke the callback, which still can disallow the drop. - // We can't do this earlier because we want to pass the index of the placeholder. - if (attr.dndDragover && !invokeCallback(attr.dndDragover, event)) { - return stopDragover(); - } - - element.addClass("dndDragover"); - event.preventDefault(); - event.stopPropagation(); - return false; - }); - - /** - * When the element is dropped, we use the position of the placeholder element as the - * position where we insert the transferred data. This assumes that the list has exactly - * one child element per array element. - */ - element.on('drop', function(event) { - event = event.originalEvent || event; - - if (!isDropAllowed(event)) return true; - - // The default behavior in Firefox is to interpret the dropped element as URL and - // forward to it. We want to prevent that even if our drop is aborted. - event.preventDefault(); - - // Unserialize the data that was serialized in dragstart. According to the HTML5 specs, - // the "Text" drag type will be converted to text/plain, but IE does not do that. - var data = event.dataTransfer.getData("Text") || event.dataTransfer.getData("text/plain"); - var transferredObject; - try { - transferredObject = JSON.parse(data); - } catch(e) { - return stopDragover(); - } - - // Invoke the callback, which can transform the transferredObject and even abort the drop. - if (attr.dndDrop) { - transferredObject = invokeCallback(attr.dndDrop, event, transferredObject); - if (!transferredObject) { - return stopDragover(); - } - } - - // Retrieve the JSON array and insert the transferred object into it. - var targetArray = scope.$eval(attr.dndList); - scope.$apply(function() { - targetArray.splice(getPlaceholderIndex(), 0, transferredObject); - }); - - // Invoke the callback, after the transfered objrct is added to the new container. - if (attr.dndAfterDrop) { - invokeCallback(attr.dndAfterDrop, event, transferredObject); - } - // In Chrome on Windows the dropEffect will always be none... - // We have to determine the actual effect manually from the allowed effects - if (event.dataTransfer.dropEffect === "none") { - if (event.dataTransfer.effectAllowed === "copy" || - event.dataTransfer.effectAllowed === "move") { - dndDropEffectWorkaround.dropEffect = event.dataTransfer.effectAllowed; - } else { - dndDropEffectWorkaround.dropEffect = event.ctrlKey ? "copy" : "move"; - } - } else { - dndDropEffectWorkaround.dropEffect = event.dataTransfer.dropEffect; - } - - // Clean up - stopDragover(); - event.stopPropagation(); - return false; - }); - - /** - * We have to remove the placeholder when the element is no longer dragged over our list. The - * problem is that the dragleave event is not only fired when the element leaves our list, - * but also when it leaves a child element -- so practically it's fired all the time. As a - * workaround we wait a few milliseconds and then check if the dndDragover class was added - * again. If it is there, dragover must have been called in the meantime, i.e. the element - * is still dragging over the list. If you know a better way of doing this, please tell me! - */ - element.on('dragleave', function(event) { - event = event.originalEvent || event; - - element.removeClass("dndDragover"); - $timeout(function() { - if (!element.hasClass("dndDragover")) { - placeholder.remove(); - } - }, 100); - }); - - /** - * Checks whether the mouse pointer is in the first half of the given target element. - * - * In Chrome we can just use offsetY, but in Firefox we have to use layerY, which only - * works if the child element has position relative. In IE the events are only triggered - * on the listNode instead of the listNodeItem, therefore the mouse positions are - * relative to the parent element of targetNode. - */ - function isMouseInFirstHalf(event, targetNode, relativeToParent) { - var mousePointer = horizontal ? (event.offsetX || event.layerX) - : (event.offsetY || event.layerY); - var targetSize = horizontal ? targetNode.offsetWidth : targetNode.offsetHeight; - var targetPosition = horizontal ? targetNode.offsetLeft : targetNode.offsetTop; - targetPosition = relativeToParent ? targetPosition : 0; - return mousePointer < targetPosition + targetSize / 2; - } - - /** - * Flowable-patched version of isMouseInFirstHalf that uses page and bounding client rect - * instead of the offsetX and layerX properties to determine which half of target the mouse pointer is hovering - * this is more natural since th method now actually works like above, but it also adds some mild - * flickering when sorting inside the list, why its still not in use. - */ - function isMouseInFirstHalf_new(event, targetNode, relativeToParent) { - var targetNodeRect = targetNode.getBoundingClientRect(); - if (horizontal) { - return (event.pageX - targetNodeRect.left) < (targetNodeRect.width / 2); - } - else { - return (event.pageY - targetNodeRect.top) < (targetNodeRect.height / 2); - } - } - /** - * We use the position of the placeholder node to determine at which position of the array the - * object needs to be inserted - */ - function getPlaceholderIndex() { - return Array.prototype.indexOf.call(listNode.children, placeholderNode); - } - - /** - * Checks various conditions that must be fulfilled for a drop to be allowed - */ - function isDropAllowed(event) { - // Disallow drop from external source unless it's allowed explicitly. - if (!dndDragTypeWorkaround.isDragging && !externalSources) return false; - - // Check mimetype. Usually we would use a custom drag type instead of Text, but IE doesn't - // support that. - if (!hasTextMimetype(event.dataTransfer.types)) return false; - - // Now check the dnd-allowed-types against the type of the incoming element. For drops from - // external sources we don't know the type, so it will need to be checked via dnd-drop. - if (attr.dndAllowedTypes && dndDragTypeWorkaround.isDragging) { - var allowed = scope.$eval(attr.dndAllowedTypes); - if (angular.isArray(allowed) && allowed.indexOf(dndDragTypeWorkaround.dragType) === -1) { - return false; - } - } - - // Check whether droping is disabled completely - if (attr.dndDisableIf && scope.$eval(attr.dndDisableIf)) return false; - - return true; - } - - /** - * Small helper function that cleans up if we aborted a drop. - */ - function stopDragover() { - placeholder.remove(); - element.removeClass("dndDragover"); - return true; - } - - /** - * Invokes a callback with some interesting parameters and returns the callbacks return value. - */ - function invokeCallback(expression, event, item) { - return $parse(expression)(scope, { - event: event, - index: getPlaceholderIndex(), - item: item || undefined, - external: !dndDragTypeWorkaround.isDragging, - type: dndDragTypeWorkaround.isDragging ? dndDragTypeWorkaround.dragType : undefined - }); - } - - /** - * Check if the dataTransfer object contains a drag type that we can handle. In old versions - * of IE the types collection will not even be there, so we just assume a drop is possible. - */ - function hasTextMimetype(types) { - if (!types) return true; - for (var i = 0; i < types.length; i++) { - if (types[i] === "Text" || types[i] === "text/plain") return true; - } - - return false; - } - }; - }]) - - /** - * This workaround handles the fact that Internet Explorer does not support drag types other than - * "Text" and "URL". That means we can not know whether the data comes from one of our elements or - * is just some other data like a text selection. As a workaround we save the isDragging flag in - * here. When a dropover event occurs, we only allow the drop if we are already dragging, because - * that means the element is ours. - */ - .factory('dndDragTypeWorkaround', function(){ return {} }) - - /** - * Chrome on Windows does not set the dropEffect field, which we need in dragend to determine - * whether a drag operation was successful. Therefore we have to maintain it in this global - * variable. The bug report for that has been open for years: - * https://code.google.com/p/chromium/issues/detail?id=39399 - */ - .factory('dndDropEffectWorkaround', function(){ return {} }); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-drag-and-drop-lists_1.2.0/angular-drag-and-drop-lists.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-drag-and-drop-lists_1.2.0/angular-drag-and-drop-lists.min.js deleted file mode 100644 index d21e062a..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-drag-and-drop-lists_1.2.0/angular-drag-and-drop-lists.min.js +++ /dev/null @@ -1 +0,0 @@ -angular.module("dndLists",[]).directive("dndDraggable",["$parse","$timeout","dndDropEffectWorkaround","dndDragTypeWorkaround",function(e,t,n,r){return function(i,s,o){s.attr("draggable","true");if(o.dndDisableIf){i.$watch(o.dndDisableIf,function(e){s.attr("draggable",!e)})}s.on("dragstart",function(u){u=u.originalEvent||u;u.dataTransfer.setData("Text",angular.toJson(i.$eval(o.dndDraggable)));u.dataTransfer.effectAllowed=o.dndEffectAllowed||"move";s.addClass("dndDragging");t(function(){s.addClass("dndDraggingSource")},0);n.dropEffect="none";r.isDragging=true;r.dragType=o.dndType?i.$eval(o.dndType):undefined;e(o.dndDragstart)(i,{event:u});u.stopPropagation()});s.on("dragend",function(t){t=t.originalEvent||t;var u=n.dropEffect;i.$apply(function(){switch(u){case"move":e(o.dndMoved)(i,{event:t});break;case"copy":e(o.dndCopied)(i,{event:t});break}});s.removeClass("dndDragging");s.removeClass("dndDraggingSource");r.isDragging=false;t.stopPropagation()});s.on("click",function(t){t=t.originalEvent||t;i.$apply(function(){e(o.dndSelected)(i,{event:t})});t.stopPropagation()});s.on("selectstart",function(){if(this.dragDrop)this.dragDrop();return false})}}]).directive("dndList",["$parse","$timeout","dndDropEffectWorkaround","dndDragTypeWorkaround",function(e,t,n,r){return function(i,s,o){function h(e,t,n){var r=l?e.offsetX||e.layerX:e.offsetY||e.layerY;var i=l?t.offsetWidth:t.offsetHeight;var s=l?t.offsetLeft:t.offsetTop;s=n?s:0;return r");var a=u[0];var f=s[0];var l=o.dndHorizontalList&&i.$eval(o.dndHorizontalList);var c=o.dndExternalSources&&i.$eval(o.dndExternalSources);s.on("dragover",function(e){e=e.originalEvent||e;if(!d(e))return true;if(a.parentNode!=f){s.append(u)}if(e.target!==f){var t=e.target;while(t.parentNode!==f&&t.parentNode){t=t.parentNode}if(t.parentNode===f&&t!==a){if(h(e,t)){f.insertBefore(a,t)}else{f.insertBefore(a,t.nextSibling)}}}else{if(h(e,a,true)){while(a.previousElementSibling&&(h(e,a.previousElementSibling,true)||a.previousElementSibling.offsetHeight===0)){f.insertBefore(a,a.previousElementSibling)}}else{while(a.nextElementSibling&&!h(e,a.nextElementSibling,true)){f.insertBefore(a,a.nextElementSibling.nextElementSibling)}}}if(o.dndDragover&&!m(o.dndDragover,e)){return v()}s.addClass("dndDragover");e.preventDefault();e.stopPropagation();return false});s.on("drop",function(e){e=e.originalEvent||e;if(!d(e))return true;e.preventDefault();var t=e.dataTransfer.getData("Text")||e.dataTransfer.getData("text/plain");var r;try{r=JSON.parse(t)}catch(s){return v()}if(o.dndDrop){r=m(o.dndDrop,e,r);if(!r){return v()}}var u=i.$eval(o.dndList);i.$apply(function(){u.splice(p(),0,r)});if(e.dataTransfer.dropEffect==="none"){if(e.dataTransfer.effectAllowed==="copy"||e.dataTransfer.effectAllowed==="move"){n.dropEffect=e.dataTransfer.effectAllowed}else{n.dropEffect=e.ctrlKey?"copy":"move"}}else{n.dropEffect=e.dataTransfer.dropEffect}v();e.stopPropagation();return false});s.on("dragleave",function(e){e=e.originalEvent||e;s.removeClass("dndDragover");t(function(){if(!s.hasClass("dndDragover")){u.remove()}},100)})}}]).factory("dndDragTypeWorkaround",function(){return{}}).factory("dndDropEffectWorkaround",function(){return{}}) diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-dragdrop_1.0.11/angular-dragdrop.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-dragdrop_1.0.11/angular-dragdrop.js deleted file mode 100644 index 20aee966..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-dragdrop_1.0.11/angular-dragdrop.js +++ /dev/null @@ -1,360 +0,0 @@ -/** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -/** - * Implementing Drag and Drop functionality in AngularJS is easier than ever. - * Demo: http://codef0rmer.github.com/angular-dragdrop/ - * - * @version 1.0.11 - * - * (c) 2013 Amit Gharat a.k.a codef0rmer - amitgharat.wordpress.com - */ - -(function (window, angular, $, undefined) { - 'use strict'; - - var jqyoui = angular.module('ngDragDrop', []).service('ngDragDropService', ['$timeout', '$parse', function($timeout, $parse) { - this.draggableScope = null; - this.droppableScope = null; - - this.callEventCallback = function (scope, callbackName, event, ui) { - if (!callbackName) return; - - var objExtract = extract(callbackName), - callback = objExtract.callback, - constructor = objExtract.constructor, - args = [event, ui].concat(objExtract.args); - - // call either $scoped method i.e. $scope.dropCallback or constructor's method i.e. this.dropCallback. - // Removing scope.$apply call that was performance intensive (especially onDrag) and does not require it - // always. So call it within the callback if needed. - return (scope[callback] || scope[constructor][callback]).apply(scope, args); - - function extract(callbackName) { - var atStartBracket = callbackName.indexOf('(') !== -1 ? callbackName.indexOf('(') : callbackName.length, - atEndBracket = callbackName.lastIndexOf(')') !== -1 ? callbackName.lastIndexOf(')') : callbackName.length, - args = callbackName.substring(atStartBracket + 1, atEndBracket), // matching function arguments inside brackets - constructor = callbackName.match(/^[^.]+.\s*/)[0].slice(0, -1); // matching a string upto a dot to check ctrl as syntax - constructor = scope[constructor] && typeof scope[constructor].constructor === 'function' ? constructor : null; - - return { - callback: callbackName.substring(constructor && constructor.length + 1 || 0, atStartBracket), - args: $.map(args && args.split(',') || [], function(item) { return [$parse(item)(scope)]; }), - constructor: constructor - } - } - }; - - this.invokeDrop = function ($draggable, $droppable, event, ui) { - var dragModel = '', - dropModel = '', - dragSettings = {}, - dropSettings = {}, - jqyoui_pos = null, - dragItem = {}, - dropItem = {}, - dragModelValue, - dropModelValue, - $droppableDraggable = null, - droppableScope = this.droppableScope, - draggableScope = this.draggableScope; - - dragModel = $draggable.ngattr('ng-model'); - dropModel = $droppable.ngattr('ng-model'); - dragModelValue = draggableScope.$eval(dragModel); - dropModelValue = droppableScope.$eval(dropModel); - - $droppableDraggable = $droppable.find('[jqyoui-draggable]:last,[data-jqyoui-draggable]:last'); - dropSettings = droppableScope.$eval($droppable.attr('jqyoui-droppable') || $droppable.attr('data-jqyoui-droppable')) || []; - dragSettings = draggableScope.$eval($draggable.attr('jqyoui-draggable') || $draggable.attr('data-jqyoui-draggable')) || []; - - // Helps pick up the right item - dragSettings.index = this.fixIndex(draggableScope, dragSettings, dragModelValue); - dropSettings.index = this.fixIndex(droppableScope, dropSettings, dropModelValue); - - jqyoui_pos = angular.isArray(dragModelValue) ? dragSettings.index : null; - dragItem = angular.isArray(dragModelValue) ? dragModelValue[jqyoui_pos] : dragModelValue; - - if (dragSettings.deepCopy) { - dragItem = angular.copy(dragItem); - } - - if (angular.isArray(dropModelValue) && dropSettings && dropSettings.index !== undefined) { - dropItem = dropModelValue[dropSettings.index]; - } else if (!angular.isArray(dropModelValue)) { - dropItem = dropModelValue; - } else { - dropItem = {}; - } - - if (dropSettings.deepCopy) { - dropItem = angular.copy(dropItem); - } - - if (dragSettings.animate === true) { - this.move($draggable, $droppableDraggable.length > 0 ? $droppableDraggable : $droppable, null, 'fast', dropSettings, null); - this.move($droppableDraggable.length > 0 && !dropSettings.multiple ? $droppableDraggable : [], $draggable.parent('[jqyoui-droppable],[data-jqyoui-droppable]'), jqyoui.startXY, 'fast', dropSettings, angular.bind(this, function() { - $timeout(angular.bind(this, function() { - // Do not move this into move() to avoid flickering issue - $draggable.css({'position': 'relative', 'left': '', 'top': ''}); - // Angular v1.2 uses ng-hide to hide an element not display property - // so we've to manually remove display:none set in this.move() - $droppableDraggable.css({'position': 'relative', 'left': '', 'top': '', 'display': $droppableDraggable.css('display') === 'none' ? '' : $droppableDraggable.css('display')}); - - this.mutateDraggable(draggableScope, dropSettings, dragSettings, dragModel, dropModel, dropItem, $draggable); - this.mutateDroppable(droppableScope, dropSettings, dragSettings, dropModel, dragItem, jqyoui_pos); - this.callEventCallback(droppableScope, dropSettings.onDrop, event, ui); - })); - })); - } else { - $timeout(angular.bind(this, function() { - this.mutateDraggable(draggableScope, dropSettings, dragSettings, dragModel, dropModel, dropItem, $draggable); - this.mutateDroppable(droppableScope, dropSettings, dragSettings, dropModel, dragItem, jqyoui_pos); - this.callEventCallback(droppableScope, dropSettings.onDrop, event, ui); - })); - } - }; - - this.move = function($fromEl, $toEl, toPos, duration, dropSettings, callback) { - if ($fromEl.length === 0) { - if (callback) { - window.setTimeout(function() { - callback(); - }, 300); - } - return false; - } - - var zIndex = $fromEl.css('z-index'), - fromPos = $fromEl[dropSettings.containment || 'offset'](), - displayProperty = $toEl.css('display'), // sometimes `display` is other than `block` - hadNgHideCls = $toEl.hasClass('ng-hide'); - - if (toPos === null && $toEl.length > 0) { - if (($toEl.attr('jqyoui-draggable') || $toEl.attr('data-jqyoui-draggable')) !== undefined && $toEl.ngattr('ng-model') !== undefined && $toEl.is(':visible') && dropSettings && dropSettings.multiple) { - toPos = $toEl[dropSettings.containment || 'offset'](); - if (dropSettings.stack === false) { - toPos.left+= $toEl.outerWidth(true); - } else { - toPos.top+= $toEl.outerHeight(true); - } - } else { - // Angular v1.2 uses ng-hide to hide an element - // so we've to remove it in order to grab its position - if (hadNgHideCls) $toEl.removeClass('ng-hide'); - toPos = $toEl.css({'visibility': 'hidden', 'display': 'block'})[dropSettings.containment || 'offset'](); - $toEl.css({'visibility': '','display': displayProperty}); - } - } - - $fromEl.css({'position': 'absolute', 'z-index': 9999}) - .css(fromPos) - .animate(toPos, duration, function() { - // Angular v1.2 uses ng-hide to hide an element - // and as we remove it above, we've to put it back to - // hide the element (while swapping) if it was hidden already - // because we remove the display:none in this.invokeDrop() - if (hadNgHideCls) $toEl.addClass('ng-hide'); - $fromEl.css('z-index', zIndex); - if (callback) callback(); - }); - }; - - this.mutateDroppable = function(scope, dropSettings, dragSettings, dropModel, dragItem, jqyoui_pos) { - var dropModelValue = scope.$eval(dropModel); - - scope.dndDragItem = dragItem; - - if (angular.isArray(dropModelValue)) { - if (dropSettings && dropSettings.index >= 0) { - dropModelValue[dropSettings.index] = dragItem; - } else { - dropModelValue.push(dragItem); - } - if (dragSettings && dragSettings.placeholder === true) { - dropModelValue[dropModelValue.length - 1]['jqyoui_pos'] = jqyoui_pos; - } - } else { - $parse(dropModel + ' = dndDragItem')(scope); - if (dragSettings && dragSettings.placeholder === true) { - dropModelValue['jqyoui_pos'] = jqyoui_pos; - } - } - }; - - this.mutateDraggable = function(scope, dropSettings, dragSettings, dragModel, dropModel, dropItem, $draggable) { - var isEmpty = angular.equals(dropItem, {}) || !dropItem, - dragModelValue = scope.$eval(dragModel); - - scope.dndDropItem = dropItem; - - if (dragSettings && dragSettings.placeholder) { - if (dragSettings.placeholder != 'keep'){ - if (angular.isArray(dragModelValue) && dragSettings.index !== undefined) { - dragModelValue[dragSettings.index] = dropItem; - } else { - $parse(dragModel + ' = dndDropItem')(scope); - } - } - } else { - if (angular.isArray(dragModelValue)) { - if (isEmpty) { - if (dragSettings && ( dragSettings.placeholder !== true && dragSettings.placeholder !== 'keep' )) { - dragModelValue.splice(dragSettings.index, 1); - } - } else { - dragModelValue[dragSettings.index] = dropItem; - } - } else { - // Fix: LIST(object) to LIST(array) - model does not get updated using just scope[dragModel] = {...} - // P.S.: Could not figure out why it happened - $parse(dragModel + ' = dndDropItem')(scope); - if (scope.$parent) { - $parse(dragModel + ' = dndDropItem')(scope.$parent); - } - } - } - - $draggable.css({'z-index': '', 'left': '', 'top': ''}); - }; - - this.fixIndex = function(scope, settings, modelValue) { - if (settings.applyFilter && angular.isArray(modelValue) && modelValue.length > 0) { - var dragModelValueFiltered = scope[settings.applyFilter](), - lookup = dragModelValueFiltered[settings.index], - actualIndex = undefined; - - modelValue.forEach(function(item, i) { - if (angular.equals(item, lookup)) { - actualIndex = i; - } - }); - - return actualIndex; - } - - return settings.index; - }; - }]).directive('jqyouiDraggable', ['ngDragDropService', function(ngDragDropService) { - return { - require: '?jqyouiDroppable', - restrict: 'A', - link: function(scope, element, attrs) { - var dragSettings, jqyouiOptions, zIndex; - var updateDraggable = function(newValue, oldValue) { - if (newValue) { - dragSettings = scope.$eval(element.attr('jqyoui-draggable') || element.attr('data-jqyoui-draggable')) || {}; - jqyouiOptions = scope.$eval(attrs.jqyouiOptions) || {}; - element - .draggable({disabled: false}) - .draggable(jqyouiOptions) - .draggable({ - start: function(event, ui) { - ngDragDropService.draggableScope = scope; - zIndex = angular.element(jqyouiOptions.helper ? ui.helper : this).css('z-index'); - angular.element(jqyouiOptions.helper ? ui.helper : this).css('z-index', 9999); - jqyoui.startXY = angular.element(this)[dragSettings.containment || 'offset'](); - ngDragDropService.callEventCallback(scope, dragSettings.onStart, event, ui); - }, - stop: function(event, ui) { - angular.element(jqyouiOptions.helper ? ui.helper : this).css('z-index', zIndex); - ngDragDropService.callEventCallback(scope, dragSettings.onStop, event, ui); - }, - drag: function(event, ui) { - ngDragDropService.callEventCallback(scope, dragSettings.onDrag, event, ui); - } - }); - } else { - element.draggable({disabled: true}); - } - }; - scope.$watch(function() { return scope.$eval(attrs.drag); }, updateDraggable); - updateDraggable(); - - element.on('$destroy', function() { - element.draggable({disabled: true}).draggable('destroy'); - }); - } - }; - }]).directive('jqyouiDroppable', ['ngDragDropService', '$q', function(ngDragDropService, $q) { - return { - restrict: 'A', - priority: 1, - link: function(scope, element, attrs) { - var dropSettings; - var updateDroppable = function(newValue, oldValue) { - if (newValue) { - dropSettings = scope.$eval(angular.element(element).attr('jqyoui-droppable') || angular.element(element).attr('data-jqyoui-droppable')) || {}; - element - .droppable({disabled: false}) - .droppable(scope.$eval(attrs.jqyouiOptions) || {}) - .droppable({ - over: function(event, ui) { - ngDragDropService.callEventCallback(scope, dropSettings.onOver, event, ui); - }, - out: function(event, ui) { - ngDragDropService.callEventCallback(scope, dropSettings.onOut, event, ui); - }, - drop: function(event, ui) { - var beforeDropPromise = null; - - if (dropSettings.beforeDrop) { - beforeDropPromise = ngDragDropService.callEventCallback(scope, dropSettings.beforeDrop, event, ui); - } else { - beforeDropPromise = (function() { - var deferred = $q.defer(); - deferred.resolve(); - return deferred.promise; - })(); - } - - beforeDropPromise.then(angular.bind(this, function() { - if (angular.element(ui.draggable).ngattr('ng-model') && attrs.ngModel) { - ngDragDropService.droppableScope = scope; - ngDragDropService.invokeDrop(angular.element(ui.draggable), angular.element(this), event, ui); - } else { - ngDragDropService.callEventCallback(scope, dropSettings.onDrop, event, ui); - } - }), function() { - ui.draggable.css({left: '', top: ''}); - }); - } - }); - } else { - element.droppable({disabled: true}); - } - }; - - scope.$watch(function() { return scope.$eval(attrs.drop); }, updateDroppable); - updateDroppable(); - - element.on('$destroy', function() { - element.droppable({disabled: true}).droppable('destroy'); - }); - } - }; - }]); - - angular.element.prototype.ngattr = function(name, value) { - var element = angular.element(this).get(0); - - return element.getAttribute(name) || element.getAttribute('data-' + name); - }; -})(window, window.angular, window.jQuery); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-dragdrop_1.0.11/angular-dragdrop.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-dragdrop_1.0.11/angular-dragdrop.min.js deleted file mode 100644 index bfb1cf8f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-dragdrop_1.0.11/angular-dragdrop.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -/** - * Implementing Drag and Drop functionality in AngularJS is easier than ever. - * Demo: http://codef0rmer.github.com/angular-dragdrop/ - * - * @version 1.0.11 - * - * (c) 2013 Amit Gharat a.k.a codef0rmer - amitgharat.wordpress.com - */ -(function(e,t,n,r){"use strict";var i=t.module("ngDragDrop",[]).service("ngDragDropService",["$timeout","$parse",function(s,o){this.draggableScope=null;this.droppableScope=null;this.callEventCallback=function(e,t,r,i){function l(t){var r=t.indexOf("(")!==-1?t.indexOf("("):t.length,i=t.lastIndexOf(")")!==-1?t.lastIndexOf(")"):t.length,s=t.substring(r+1,i),u=t.match(/^[^.]+.\s*/)[0].slice(0,-1);u=e[u]&&typeof e[u].constructor==="function"?u:null;return{callback:t.substring(u&&u.length+1||0,r),args:n.map(s&&s.split(",")||[],function(t){return[o(t)(e)]}),constructor:u}}if(!t)return;var s=l(t),u=s.callback,a=s.constructor,f=[r,i].concat(s.args);return(e[u]||e[a][u]).apply(e,f)};this.invokeDrop=function(e,n,o,u){var a="",f="",l={},c={},h=null,p={},d={},v,m,g=null,y=this.droppableScope,b=this.draggableScope;a=e.ngattr("ng-model");f=n.ngattr("ng-model");v=b.$eval(a);m=y.$eval(f);g=n.find("[jqyoui-draggable]:last,[data-jqyoui-draggable]:last");c=y.$eval(n.attr("jqyoui-droppable")||n.attr("data-jqyoui-droppable"))||[];l=b.$eval(e.attr("jqyoui-draggable")||e.attr("data-jqyoui-draggable"))||[];l.index=this.fixIndex(b,l,v);c.index=this.fixIndex(y,c,m);h=t.isArray(v)?l.index:null;p=t.isArray(v)?v[h]:v;if(l.deepCopy){p=t.copy(p)}if(t.isArray(m)&&c&&c.index!==r){d=m[c.index]}else if(!t.isArray(m)){d=m}else{d={}}if(c.deepCopy){d=t.copy(d)}if(l.animate===true){this.move(e,g.length>0?g:n,null,"fast",c,null);this.move(g.length>0&&!c.multiple?g:[],e.parent("[jqyoui-droppable],[data-jqyoui-droppable]"),i.startXY,"fast",c,t.bind(this,function(){s(t.bind(this,function(){e.css({position:"relative",left:"",top:""});g.css({position:"relative",left:"",top:"",display:g.css("display")==="none"?"":g.css("display")});this.mutateDraggable(b,c,l,a,f,d,e);this.mutateDroppable(y,c,l,f,p,h);this.callEventCallback(y,c.onDrop,o,u)}))}))}else{s(t.bind(this,function(){this.mutateDraggable(b,c,l,a,f,d,e);this.mutateDroppable(y,c,l,f,p,h);this.callEventCallback(y,c.onDrop,o,u)}))}};this.move=function(t,n,i,s,o,u){if(t.length===0){if(u){e.setTimeout(function(){u()},300)}return false}var a=t.css("z-index"),f=t[o.containment||"offset"](),l=n.css("display"),c=n.hasClass("ng-hide");if(i===null&&n.length>0){if((n.attr("jqyoui-draggable")||n.attr("data-jqyoui-draggable"))!==r&&n.ngattr("ng-model")!==r&&n.is(":visible")&&o&&o.multiple){i=n[o.containment||"offset"]();if(o.stack===false){i.left+=n.outerWidth(true)}else{i.top+=n.outerHeight(true)}}else{if(c)n.removeClass("ng-hide");i=n.css({visibility:"hidden",display:"block"})[o.containment||"offset"]();n.css({visibility:"",display:l})}}t.css({position:"absolute","z-index":9999}).css(f).animate(i,s,function(){if(c)n.addClass("ng-hide");t.css("z-index",a);if(u)u()})};this.mutateDroppable=function(e,n,r,i,s,u){var a=e.$eval(i);e.dndDragItem=s;if(t.isArray(a)){if(n&&n.index>=0){a[n.index]=s}else{a.push(s)}if(r&&r.placeholder===true){a[a.length-1]["jqyoui_pos"]=u}}else{o(i+" = dndDragItem")(e);if(r&&r.placeholder===true){a["jqyoui_pos"]=u}}};this.mutateDraggable=function(e,n,i,s,u,a,f){var l=t.equals(a,{})||!a,c=e.$eval(s);e.dndDropItem=a;if(i&&i.placeholder){if(i.placeholder!="keep"){if(t.isArray(c)&&i.index!==r){c[i.index]=a}else{o(s+" = dndDropItem")(e)}}}else{if(t.isArray(c)){if(l){if(i&&i.placeholder!==true&&i.placeholder!=="keep"){c.splice(i.index,1)}}else{c[i.index]=a}}else{o(s+" = dndDropItem")(e);if(e.$parent){o(s+" = dndDropItem")(e.$parent)}}}f.css({"z-index":"",left:"",top:""})};this.fixIndex=function(e,n,i){if(n.applyFilter&&t.isArray(i)&&i.length>0){var s=e[n.applyFilter](),o=s[n.index],u=r;i.forEach(function(e,n){if(t.equals(e,o)){u=n}});return u}return n.index}}]).directive("jqyouiDraggable",["ngDragDropService",function(e){return{require:"?jqyouiDroppable",restrict:"A",link:function(n,r,s){var o,u,a;var f=function(f,l){if(f){o=n.$eval(r.attr("jqyoui-draggable")||r.attr("data-jqyoui-draggable"))||{};u=n.$eval(s.jqyouiOptions)||{};r.draggable({disabled:false}).draggable(u).draggable({start:function(r,s){e.draggableScope=n;a=t.element(u.helper?s.helper:this).css("z-index");t.element(u.helper?s.helper:this).css("z-index",9999);i.startXY=t.element(this)[o.containment||"offset"]();e.callEventCallback(n,o.onStart,r,s)},stop:function(r,i){t.element(u.helper?i.helper:this).css("z-index",a);e.callEventCallback(n,o.onStop,r,i)},drag:function(t,r){e.callEventCallback(n,o.onDrag,t,r)}})}else{r.draggable({disabled:true})}};n.$watch(function(){return n.$eval(s.drag)},f);f();r.on("$destroy",function(){r.draggable({disabled:true}).draggable("destroy")})}}}]).directive("jqyouiDroppable",["ngDragDropService","$q",function(e,n){return{restrict:"A",priority:1,link:function(r,i,s){var o;var u=function(u,a){if(u){o=r.$eval(t.element(i).attr("jqyoui-droppable")||t.element(i).attr("data-jqyoui-droppable"))||{};i.droppable({disabled:false}).droppable(r.$eval(s.jqyouiOptions)||{}).droppable({over:function(t,n){e.callEventCallback(r,o.onOver,t,n)},out:function(t,n){e.callEventCallback(r,o.onOut,t,n)},drop:function(i,u){var a=null;if(o.beforeDrop){a=e.callEventCallback(r,o.beforeDrop,i,u)}else{a=function(){var e=n.defer();e.resolve();return e.promise}()}a.then(t.bind(this,function(){if(t.element(u.draggable).ngattr("ng-model")&&s.ngModel){e.droppableScope=r;e.invokeDrop(t.element(u.draggable),t.element(this),i,u)}else{e.callEventCallback(r,o.onDrop,i,u)}}),function(){u.draggable.css({left:"",top:""})})}})}else{i.droppable({disabled:true})}};r.$watch(function(){return r.$eval(s.drop)},u);u();i.on("$destroy",function(){i.droppable({disabled:true}).droppable("destroy")})}}}]);t.element.prototype.ngattr=function(e,n){var r=t.element(this).get(0);return r.getAttribute(e)||r.getAttribute("data-"+e)}})(window,window.angular,window.jQuery) \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.js deleted file mode 100755 index 37b400cb..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.js +++ /dev/null @@ -1,2109 +0,0 @@ -(function(angular) { - - 'use strict'; - - angular.module('gridster', []) - - .constant('gridsterConfig', { - columns: 6, // number of columns in the grid - pushing: true, // whether to push other items out of the way - floating: true, // whether to automatically float items up so they stack - swapping: false, // whether or not to have items switch places instead of push down if they are the same size - width: 'auto', // width of the grid. "auto" will expand the grid to its parent container - colWidth: 'auto', // width of grid columns. "auto" will divide the width of the grid evenly among the columns - rowHeight: 'match', // height of grid rows. 'match' will make it the same as the column width, a numeric value will be interpreted as pixels, '/2' is half the column width, '*5' is five times the column width, etc. - margins: [10, 10], // margins in between grid items - outerMargin: true, - isMobile: false, // toggle mobile view - mobileBreakPoint: 600, // width threshold to toggle mobile mode - mobileModeEnabled: true, // whether or not to toggle mobile mode when screen width is less than mobileBreakPoint - minColumns: 1, // minimum amount of columns the grid can scale down to - minRows: 1, // minimum amount of rows to show if the grid is empty - maxRows: 100, // maximum amount of rows in the grid - defaultSizeX: 2, // default width of an item in columns - defaultSizeY: 1, // default height of an item in rows - minSizeX: 1, // minimum column width of an item - maxSizeX: null, // maximum column width of an item - minSizeY: 1, // minumum row height of an item - maxSizeY: null, // maximum row height of an item - saveGridItemCalculatedHeightInMobile: false, // grid item height in mobile display. true- to use the calculated height by sizeY given - resizable: { // options to pass to resizable handler - enabled: true, - handles: ['s', 'e', 'n', 'w', 'se', 'ne', 'sw', 'nw'] - }, - draggable: { // options to pass to draggable handler - enabled: true, - scrollSensitivity: 20, // Distance in pixels from the edge of the viewport after which the viewport should scroll, relative to pointer - scrollSpeed: 15 // Speed at which the window should scroll once the mouse pointer gets within scrollSensitivity distance - } - }) - - .controller('GridsterCtrl', ['gridsterConfig', '$timeout', - function(gridsterConfig, $timeout) { - - var gridster = this; - - /** - * Create options from gridsterConfig constant - */ - angular.extend(this, gridsterConfig); - - this.resizable = angular.extend({}, gridsterConfig.resizable || {}); - this.draggable = angular.extend({}, gridsterConfig.draggable || {}); - - var flag = false; - this.layoutChanged = function() { - if (flag) { - return; - } - flag = true; - $timeout(function() { - flag = false; - if (gridster.loaded) { - gridster.floatItemsUp(); - } - gridster.updateHeight(gridster.movingItem ? gridster.movingItem.sizeY : 0); - }); - }; - - /** - * A positional array of the items in the grid - */ - this.grid = []; - - /** - * Clean up after yourself - */ - this.destroy = function() { - if (this.grid) { - this.grid.length = 0; - this.grid = null; - } - }; - - /** - * Overrides default options - * - * @param {object} options The options to override - */ - this.setOptions = function(options) { - if (!options) { - return; - } - - options = angular.extend({}, options); - - // all this to avoid using jQuery... - if (options.draggable) { - angular.extend(this.draggable, options.draggable); - delete(options.draggable); - } - if (options.resizable) { - angular.extend(this.resizable, options.resizable); - delete(options.resizable); - } - - angular.extend(this, options); - - if (!this.margins || this.margins.length !== 2) { - this.margins = [0, 0]; - } else { - for (var x = 0, l = this.margins.length; x < l; ++x) { - this.margins[x] = parseInt(this.margins[x], 10); - if (isNaN(this.margins[x])) { - this.margins[x] = 0; - } - } - } - }; - - /** - * Check if item can occupy a specified position in the grid - * - * @param {object} item The item in question - * @param {number} row The row index - * @param {number} column The column index - * @returns {boolean} True if if item fits - */ - this.canItemOccupy = function(item, row, column) { - return row > -1 && column > -1 && item.sizeX + column <= this.columns && item.sizeY + row <= this.maxRows; - }; - - /** - * Set the item in the first suitable position - * - * @param {object} item The item to insert - */ - this.autoSetItemPosition = function(item) { - // walk through each row and column looking for a place it will fit - for (var rowIndex = 0; rowIndex < this.maxRows; ++rowIndex) { - for (var colIndex = 0; colIndex < this.columns; ++colIndex) { - // only insert if position is not already taken and it can fit - var items = this.getItems(rowIndex, colIndex, item.sizeX, item.sizeY, item); - if (items.length === 0 && this.canItemOccupy(item, rowIndex, colIndex)) { - this.putItem(item, rowIndex, colIndex); - return; - } - } - } - throw new Error('Unable to place item!'); - }; - - /** - * Gets items at a specific coordinate - * - * @param {number} row - * @param {number} column - * @param {number} sizeX - * @param {number} sizeY - * @param {array} excludeItems An array of items to exclude from selection - * @returns {array} Items that match the criteria - */ - this.getItems = function(row, column, sizeX, sizeY, excludeItems) { - var items = []; - if (!sizeX || !sizeY) { - sizeX = sizeY = 1; - } - if (excludeItems && !(excludeItems instanceof Array)) { - excludeItems = [excludeItems]; - } - for (var h = 0; h < sizeY; ++h) { - for (var w = 0; w < sizeX; ++w) { - var item = this.getItem(row + h, column + w, excludeItems); - if (item && (!excludeItems || excludeItems.indexOf(item) === -1) && items.indexOf(item) === -1) { - items.push(item); - } - } - } - return items; - }; - - this.getBoundingBox = function(items) { - - if (items.length === 0) { - return null; - } - if (items.length === 1) { - return { - row: items[0].row, - col: items[0].col, - sizeY: items[0].sizeY, - sizeX: items[0].sizeX - }; - } - - var maxRow = 0; - var maxCol = 0; - var minRow = 9999; - var minCol = 9999; - - for (var i = 0, l = items.length; i < l; ++i) { - var item = items[i]; - minRow = Math.min(item.row, minRow); - minCol = Math.min(item.col, minCol); - maxRow = Math.max(item.row + item.sizeY, maxRow); - maxCol = Math.max(item.col + item.sizeX, maxCol); - } - - return { - row: minRow, - col: minCol, - sizeY: maxRow - minRow, - sizeX: maxCol - minCol - }; - }; - - - /** - * Removes an item from the grid - * - * @param {object} item - */ - this.removeItem = function(item) { - for (var rowIndex = 0, l = this.grid.length; rowIndex < l; ++rowIndex) { - var columns = this.grid[rowIndex]; - if (!columns) { - continue; - } - var index = columns.indexOf(item); - if (index !== -1) { - columns[index] = null; - break; - } - } - this.layoutChanged(); - }; - - /** - * Returns the item at a specified coordinate - * - * @param {number} row - * @param {number} column - * @param {array} excludeitems Items to exclude from selection - * @returns {object} The matched item or null - */ - this.getItem = function(row, column, excludeItems) { - if (excludeItems && !(excludeItems instanceof Array)) { - excludeItems = [excludeItems]; - } - var sizeY = 1; - while (row > -1) { - var sizeX = 1, - col = column; - while (col > -1) { - var items = this.grid[row]; - if (items) { - var item = items[col]; - if (item && (!excludeItems || excludeItems.indexOf(item) === -1) && item.sizeX >= sizeX && item.sizeY >= sizeY) { - return item; - } - } - ++sizeX; - --col; - } - --row; - ++sizeY; - } - return null; - }; - - /** - * Insert an array of items into the grid - * - * @param {array} items An array of items to insert - */ - this.putItems = function(items) { - for (var i = 0, l = items.length; i < l; ++i) { - this.putItem(items[i]); - } - }; - - /** - * Insert a single item into the grid - * - * @param {object} item The item to insert - * @param {number} row (Optional) Specifies the items row index - * @param {number} column (Optional) Specifies the items column index - * @param {array} ignoreItems - */ - this.putItem = function(item, row, column, ignoreItems) { - if (typeof row === 'undefined' || row === null) { - row = item.row; - column = item.col; - if (typeof row === 'undefined' || row === null) { - this.autoSetItemPosition(item); - return; - } - } - if (!this.canItemOccupy(item, row, column)) { - column = Math.min(this.columns - item.sizeX, Math.max(0, column)); - row = Math.min(this.maxRows - item.sizeY, Math.max(0, row)); - } - - if (item.oldRow !== null && typeof item.oldRow !== 'undefined') { - var samePosition = item.oldRow === row && item.oldColumn === column; - var inGrid = this.grid[row] && this.grid[row][column] === item; - if (samePosition && inGrid) { - item.row = row; - item.col = column; - return; - } else { - // remove from old position - var oldRow = this.grid[item.oldRow]; - if (oldRow && oldRow[item.oldColumn] === item) { - delete oldRow[item.oldColumn]; - } - } - } - - item.oldRow = item.row = row; - item.oldColumn = item.col = column; - - this.moveOverlappingItems(item, ignoreItems); - - if (!this.grid[row]) { - this.grid[row] = []; - } - this.grid[row][column] = item; - - if (this.movingItem === item) { - this.floatItemUp(item); - } - this.layoutChanged(); - }; - - /** - * Trade row and column if item1 with item2 - * - * @param {object} item1 - * @param {object} item2 - */ - this.swapItems = function(item1, item2) { - this.grid[item1.row][item1.col] = item2; - this.grid[item2.row][item2.col] = item1; - - var item1Row = item1.row; - var item1Col = item1.col; - item1.row = item2.row; - item1.col = item2.col; - item2.row = item1Row; - item2.col = item1Col; - }; - - /** - * Prevents items from being overlapped - * - * @param {object} item The item that should remain - * @param {array} ignoreItems - */ - this.moveOverlappingItems = function(item, ignoreItems) { - if (ignoreItems) { - if (ignoreItems.indexOf(item) === -1) { - ignoreItems = ignoreItems.slice(0); - ignoreItems.push(item); - } - } else { - ignoreItems = [item]; - } - var overlappingItems = this.getItems( - item.row, - item.col, - item.sizeX, - item.sizeY, - ignoreItems - ); - this.moveItemsDown(overlappingItems, item.row + item.sizeY, ignoreItems); - }; - - /** - * Moves an array of items to a specified row - * - * @param {array} items The items to move - * @param {number} newRow The target row - * @param {array} ignoreItems - */ - this.moveItemsDown = function(items, newRow, ignoreItems) { - if (!items || items.length === 0) { - return; - } - items.sort(function(a, b) { - return a.row - b.row; - }); - ignoreItems = ignoreItems ? ignoreItems.slice(0) : []; - var topRows = {}, - item, i, l; - // calculate the top rows in each column - for (i = 0, l = items.length; i < l; ++i) { - item = items[i]; - var topRow = topRows[item.col]; - if (typeof topRow === 'undefined' || item.row < topRow) { - topRows[item.col] = item.row; - } - } - // move each item down from the top row in its column to the row - for (i = 0, l = items.length; i < l; ++i) { - item = items[i]; - var rowsToMove = newRow - topRows[item.col]; - this.moveItemDown(item, item.row + rowsToMove, ignoreItems); - ignoreItems.push(item); - } - }; - - this.moveItemDown = function(item, newRow, ignoreItems) { - if (item.row >= newRow) { - return; - } - while (item.row < newRow) { - ++item.row; - this.moveOverlappingItems(item, ignoreItems); - } - this.putItem(item, item.row, item.col, ignoreItems); - }; - - /** - * Moves all items up as much as possible - */ - this.floatItemsUp = function() { - if (this.floating === false) { - return; - } - for (var rowIndex = 0, l = this.grid.length; rowIndex < l; ++rowIndex) { - var columns = this.grid[rowIndex]; - if (!columns) { - continue; - } - for (var colIndex = 0, len = columns.length; colIndex < len; ++colIndex) { - var item = columns[colIndex]; - if (item) { - this.floatItemUp(item); - } - } - } - }; - - /** - * Float an item up to the most suitable row - * - * @param {object} item The item to move - */ - this.floatItemUp = function(item) { - if (this.floating === false) { - return; - } - var colIndex = item.col, - sizeY = item.sizeY, - sizeX = item.sizeX, - bestRow = null, - bestColumn = null, - rowIndex = item.row - 1; - - while (rowIndex > -1) { - var items = this.getItems(rowIndex, colIndex, sizeX, sizeY, item); - if (items.length !== 0) { - break; - } - bestRow = rowIndex; - bestColumn = colIndex; - --rowIndex; - } - if (bestRow !== null) { - this.putItem(item, bestRow, bestColumn); - } - }; - - /** - * Update gridsters height - * - * @param {number} plus (Optional) Additional height to add - */ - this.updateHeight = function(plus) { - var maxHeight = this.minRows; - plus = plus || 0; - for (var rowIndex = this.grid.length; rowIndex >= 0; --rowIndex) { - var columns = this.grid[rowIndex]; - if (!columns) { - continue; - } - for (var colIndex = 0, len = columns.length; colIndex < len; ++colIndex) { - if (columns[colIndex]) { - maxHeight = Math.max(maxHeight, rowIndex + plus + columns[colIndex].sizeY); - } - } - } - this.gridHeight = this.maxRows - maxHeight > 0 ? Math.min(this.maxRows, maxHeight) : Math.max(this.maxRows, maxHeight); - }; - - /** - * Returns the number of rows that will fit in given amount of pixels - * - * @param {number} pixels - * @param {boolean} ceilOrFloor (Optional) Determines rounding method - */ - this.pixelsToRows = function(pixels, ceilOrFloor) { - if (ceilOrFloor === true) { - return Math.ceil(pixels / this.curRowHeight); - } else if (ceilOrFloor === false) { - return Math.floor(pixels / this.curRowHeight); - } - - return Math.round(pixels / this.curRowHeight); - }; - - /** - * Returns the number of columns that will fit in a given amount of pixels - * - * @param {number} pixels - * @param {boolean} ceilOrFloor (Optional) Determines rounding method - * @returns {number} The number of columns - */ - this.pixelsToColumns = function(pixels, ceilOrFloor) { - if (ceilOrFloor === true) { - return Math.ceil(pixels / this.curColWidth); - } else if (ceilOrFloor === false) { - return Math.floor(pixels / this.curColWidth); - } - - return Math.round(pixels / this.curColWidth); - }; - - // unified input handling - // adopted from a msdn blogs sample - this.unifiedInput = function(target, startEvent, moveEvent, endEvent) { - var lastXYById = {}; - - // Opera doesn't have Object.keys so we use this wrapper - var numberOfKeys = function(theObject) { - if (Object.keys) { - return Object.keys(theObject).length; - } - - var n = 0, - key; - for (key in theObject) { - ++n; - } - - return n; - }; - - // this calculates the delta needed to convert pageX/Y to offsetX/Y because offsetX/Y don't exist in the TouchEvent object or in Firefox's MouseEvent object - var computeDocumentToElementDelta = function(theElement) { - var elementLeft = 0; - var elementTop = 0; - var oldIEUserAgent = navigator.userAgent.match(/\bMSIE\b/); - - for (var offsetElement = theElement; offsetElement != null; offsetElement = offsetElement.offsetParent) { - // the following is a major hack for versions of IE less than 8 to avoid an apparent problem on the IEBlog with double-counting the offsets - // this may not be a general solution to IE7's problem with offsetLeft/offsetParent - if (oldIEUserAgent && - (!document.documentMode || document.documentMode < 8) && - offsetElement.currentStyle.position === 'relative' && offsetElement.offsetParent && offsetElement.offsetParent.currentStyle.position === 'relative' && offsetElement.offsetLeft === offsetElement.offsetParent.offsetLeft) { - // add only the top - elementTop += offsetElement.offsetTop; - } else { - elementLeft += offsetElement.offsetLeft; - elementTop += offsetElement.offsetTop; - } - } - - return { - x: elementLeft, - y: elementTop - }; - }; - - // cache the delta from the document to our event target (reinitialized each mousedown/MSPointerDown/touchstart) - var documentToTargetDelta = computeDocumentToElementDelta(target); - - // common event handler for the mouse/pointer/touch models and their down/start, move, up/end, and cancel events - var doEvent = function(theEvtObj) { - - if (theEvtObj.type === 'mousemove' && numberOfKeys(lastXYById) === 0) { - return; - } - - var prevent = true; - - var pointerList = theEvtObj.changedTouches ? theEvtObj.changedTouches : [theEvtObj]; - for (var i = 0; i < pointerList.length; ++i) { - var pointerObj = pointerList[i]; - var pointerId = (typeof pointerObj.identifier !== 'undefined') ? pointerObj.identifier : (typeof pointerObj.pointerId !== 'undefined') ? pointerObj.pointerId : 1; - - // use the pageX/Y coordinates to compute target-relative coordinates when we have them (in ie < 9, we need to do a little work to put them there) - if (typeof pointerObj.pageX === 'undefined') { - // initialize assuming our source element is our target - pointerObj.pageX = pointerObj.offsetX + documentToTargetDelta.x; - pointerObj.pageY = pointerObj.offsetY + documentToTargetDelta.y; - - if (pointerObj.srcElement.offsetParent === target && document.documentMode && document.documentMode === 8 && pointerObj.type === 'mousedown') { - // source element is a child piece of VML, we're in IE8, and we've not called setCapture yet - add the origin of the source element - pointerObj.pageX += pointerObj.srcElement.offsetLeft; - pointerObj.pageY += pointerObj.srcElement.offsetTop; - } else if (pointerObj.srcElement !== target && !document.documentMode || document.documentMode < 8) { - // source element isn't the target (most likely it's a child piece of VML) and we're in a version of IE before IE8 - - // the offsetX/Y values are unpredictable so use the clientX/Y values and adjust by the scroll offsets of its parents - // to get the document-relative coordinates (the same as pageX/Y) - var sx = -2, - sy = -2; // adjust for old IE's 2-pixel border - for (var scrollElement = pointerObj.srcElement; scrollElement !== null; scrollElement = scrollElement.parentNode) { - sx += scrollElement.scrollLeft ? scrollElement.scrollLeft : 0; - sy += scrollElement.scrollTop ? scrollElement.scrollTop : 0; - } - - pointerObj.pageX = pointerObj.clientX + sx; - pointerObj.pageY = pointerObj.clientY + sy; - } - } - - - var pageX = pointerObj.pageX; - var pageY = pointerObj.pageY; - - if (theEvtObj.type.match(/(start|down)$/i)) { - // clause for processing MSPointerDown, touchstart, and mousedown - - // refresh the document-to-target delta on start in case the target has moved relative to document - documentToTargetDelta = computeDocumentToElementDelta(target); - - // protect against failing to get an up or end on this pointerId - if (lastXYById[pointerId]) { - if (endEvent) { - endEvent({ - target: theEvtObj.target, - which: theEvtObj.which, - pointerId: pointerId, - pageX: pageX, - pageY: pageY - }); - } - - delete lastXYById[pointerId]; - } - - if (startEvent) { - if (prevent) { - prevent = startEvent({ - target: theEvtObj.target, - which: theEvtObj.which, - pointerId: pointerId, - pageX: pageX, - pageY: pageY - }); - } - } - - // init last page positions for this pointer - lastXYById[pointerId] = { - x: pageX, - y: pageY - }; - - // IE pointer model - if (target.msSetPointerCapture) { - target.msSetPointerCapture(pointerId); - } else if (theEvtObj.type === 'mousedown' && numberOfKeys(lastXYById) === 1) { - if (useSetReleaseCapture) { - target.setCapture(true); - } else { - document.addEventListener('mousemove', doEvent, false); - document.addEventListener('mouseup', doEvent, false); - } - } - } else if (theEvtObj.type.match(/move$/i)) { - // clause handles mousemove, MSPointerMove, and touchmove - - if (lastXYById[pointerId] && !(lastXYById[pointerId].x === pageX && lastXYById[pointerId].y === pageY)) { - // only extend if the pointer is down and it's not the same as the last point - - if (moveEvent && prevent) { - prevent = moveEvent({ - target: theEvtObj.target, - which: theEvtObj.which, - pointerId: pointerId, - pageX: pageX, - pageY: pageY - }); - } - - // update last page positions for this pointer - lastXYById[pointerId].x = pageX; - lastXYById[pointerId].y = pageY; - } - } else if (lastXYById[pointerId] && theEvtObj.type.match(/(up|end|cancel)$/i)) { - // clause handles up/end/cancel - - if (endEvent && prevent) { - prevent = endEvent({ - target: theEvtObj.target, - which: theEvtObj.which, - pointerId: pointerId, - pageX: pageX, - pageY: pageY - }); - } - - // delete last page positions for this pointer - delete lastXYById[pointerId]; - - // in the Microsoft pointer model, release the capture for this pointer - // in the mouse model, release the capture or remove document-level event handlers if there are no down points - // nothing is required for the iOS touch model because capture is implied on touchstart - if (target.msReleasePointerCapture) { - target.msReleasePointerCapture(pointerId); - } else if (theEvtObj.type === 'mouseup' && numberOfKeys(lastXYById) === 0) { - if (useSetReleaseCapture) { - target.releaseCapture(); - } else { - document.removeEventListener('mousemove', doEvent, false); - document.removeEventListener('mouseup', doEvent, false); - } - } - } - } - - if (prevent) { - if (theEvtObj.preventDefault) { - theEvtObj.preventDefault(); - } - - if (theEvtObj.preventManipulation) { - theEvtObj.preventManipulation(); - } - - if (theEvtObj.preventMouseEvent) { - theEvtObj.preventMouseEvent(); - } - } - }; - - var useSetReleaseCapture = false; - // saving the settings for contentZooming and touchaction before activation - var contentZooming, msTouchAction; - - this.enable = function() { - - if (window.navigator.msPointerEnabled) { - // Microsoft pointer model - target.addEventListener('MSPointerDown', doEvent, false); - target.addEventListener('MSPointerMove', doEvent, false); - target.addEventListener('MSPointerUp', doEvent, false); - target.addEventListener('MSPointerCancel', doEvent, false); - - // css way to prevent panning in our target area - if (typeof target.style.msContentZooming !== 'undefined') { - contentZooming = target.style.msContentZooming; - target.style.msContentZooming = 'none'; - } - - // new in Windows Consumer Preview: css way to prevent all built-in touch actions on our target - // without this, you cannot touch draw on the element because IE will intercept the touch events - if (typeof target.style.msTouchAction !== 'undefined') { - msTouchAction = target.style.msTouchAction; - target.style.msTouchAction = 'none'; - } - } else if (target.addEventListener) { - // iOS touch model - target.addEventListener('touchstart', doEvent, false); - target.addEventListener('touchmove', doEvent, false); - target.addEventListener('touchend', doEvent, false); - target.addEventListener('touchcancel', doEvent, false); - - // mouse model - target.addEventListener('mousedown', doEvent, false); - - // mouse model with capture - // rejecting gecko because, unlike ie, firefox does not send events to target when the mouse is outside target - if (target.setCapture && !window.navigator.userAgent.match(/\bGecko\b/)) { - useSetReleaseCapture = true; - - target.addEventListener('mousemove', doEvent, false); - target.addEventListener('mouseup', doEvent, false); - } - } else if (target.attachEvent && target.setCapture) { - // legacy IE mode - mouse with capture - useSetReleaseCapture = true; - target.attachEvent('onmousedown', function() { - doEvent(window.event); - window.event.returnValue = false; - return false; - }); - target.attachEvent('onmousemove', function() { - doEvent(window.event); - window.event.returnValue = false; - return false; - }); - target.attachEvent('onmouseup', function() { - doEvent(window.event); - window.event.returnValue = false; - return false; - }); - } - }; - - this.disable = function() { - if (window.navigator.msPointerEnabled) { - // Microsoft pointer model - target.removeEventListener('MSPointerDown', doEvent, false); - target.removeEventListener('MSPointerMove', doEvent, false); - target.removeEventListener('MSPointerUp', doEvent, false); - target.removeEventListener('MSPointerCancel', doEvent, false); - - // reset zooming to saved value - if (contentZooming) { - target.style.msContentZooming = contentZooming; - } - - // reset touch action setting - if (msTouchAction) { - target.style.msTouchAction = msTouchAction; - } - } else if (target.removeEventListener) { - // iOS touch model - target.removeEventListener('touchstart', doEvent, false); - target.removeEventListener('touchmove', doEvent, false); - target.removeEventListener('touchend', doEvent, false); - target.removeEventListener('touchcancel', doEvent, false); - - // mouse model - target.removeEventListener('mousedown', doEvent, false); - - // mouse model with capture - // rejecting gecko because, unlike ie, firefox does not send events to target when the mouse is outside target - if (target.setCapture && !window.navigator.userAgent.match(/\bGecko\b/)) { - useSetReleaseCapture = true; - - target.removeEventListener('mousemove', doEvent, false); - target.removeEventListener('mouseup', doEvent, false); - } - } else if (target.detachEvent && target.setCapture) { - // legacy IE mode - mouse with capture - useSetReleaseCapture = true; - target.detachEvent('onmousedown'); - target.detachEvent('onmousemove'); - target.detachEvent('onmouseup'); - } - }; - - return this; - }; - - } - ]) - - /** - * The gridster directive - * - * @param {object} $parse - * @param {object} $timeout - */ - .directive('gridster', ['$timeout', '$rootScope', '$window', - function($timeout, $rootScope, $window) { - return { - restrict: 'EAC', - // without transclude, some child items may lose their parent scope - transclude: true, - replace: true, - template: '
    ', - controller: 'GridsterCtrl', - controllerAs: 'gridster', - scope: { - config: '=?gridster' - }, - compile: function() { - - return function(scope, $elem, attrs, gridster) { - gridster.loaded = false; - - scope.gridsterClass = function() { - return { - gridster: true, - 'gridster-desktop': !gridster.isMobile, - 'gridster-mobile': gridster.isMobile, - 'gridster-loaded': gridster.loaded - }; - }; - - /** - * @returns {Object} style object for preview element - */ - scope.previewStyle = function() { - if (!gridster.movingItem) { - return { - display: 'none' - }; - } - - return { - display: 'block', - height: (gridster.movingItem.sizeY * gridster.curRowHeight - gridster.margins[0]) + 'px', - width: (gridster.movingItem.sizeX * gridster.curColWidth - gridster.margins[1]) + 'px', - top: (gridster.movingItem.row * gridster.curRowHeight + (gridster.outerMargin ? gridster.margins[0] : 0)) + 'px', - left: (gridster.movingItem.col * gridster.curColWidth + (gridster.outerMargin ? gridster.margins[1] : 0)) + 'px' - }; - }; - - var refresh = function() { - gridster.setOptions(scope.config); - - // resolve "auto" & "match" values - if (gridster.width === 'auto') { - gridster.curWidth = $elem[0].offsetWidth || parseInt($elem.css('width'), 10); - } else { - gridster.curWidth = gridster.width; - } - - if (gridster.colWidth === 'auto') { - gridster.curColWidth = (gridster.curWidth + (gridster.outerMargin ? -gridster.margins[1] : gridster.margins[1])) / gridster.columns; - } else { - gridster.curColWidth = gridster.colWidth; - } - - gridster.curRowHeight = gridster.rowHeight; - if (typeof gridster.rowHeight === 'string') { - if (gridster.rowHeight === 'match') { - gridster.curRowHeight = Math.round(gridster.curColWidth); - } else if (gridster.rowHeight.indexOf('*') !== -1) { - gridster.curRowHeight = Math.round(gridster.curColWidth * gridster.rowHeight.replace('*', '').replace(' ', '')); - } else if (gridster.rowHeight.indexOf('/') !== -1) { - gridster.curRowHeight = Math.round(gridster.curColWidth / gridster.rowHeight.replace('/', '').replace(' ', '')); - } - } - - gridster.isMobile = gridster.mobileModeEnabled && gridster.curWidth <= gridster.mobileBreakPoint; - - // loop through all items and reset their CSS - for (var rowIndex = 0, l = gridster.grid.length; rowIndex < l; ++rowIndex) { - var columns = gridster.grid[rowIndex]; - if (!columns) { - continue; - } - - for (var colIndex = 0, len = columns.length; colIndex < len; ++colIndex) { - if (columns[colIndex]) { - var item = columns[colIndex]; - item.setElementPosition(); - item.setElementSizeY(); - item.setElementSizeX(); - } - } - } - - updateHeight(); - }; - - // update grid items on config changes - scope.$watch('config', refresh, true); - - scope.$watch('config.draggable', function() { - $rootScope.$broadcast('gridster-draggable-changed'); - }, true); - - scope.$watch('config.resizable', function() { - $rootScope.$broadcast('gridster-resizable-changed'); - }, true); - - var updateHeight = function() { - $elem.css('height', (gridster.gridHeight * gridster.curRowHeight) + (gridster.outerMargin ? gridster.margins[0] : -gridster.margins[0]) + 'px'); - }; - - scope.$watch('gridster.gridHeight', updateHeight); - - scope.$watch('gridster.movingItem', function() { - gridster.updateHeight(gridster.movingItem ? gridster.movingItem.sizeY : 0); - }); - - var prevWidth = $elem[0].offsetWidth || parseInt($elem.css('width'), 10); - - function resize() { - var width = $elem[0].offsetWidth || parseInt($elem.css('width'), 10); - - if (!width || width === prevWidth || gridster.movingItem) { - return; - } - prevWidth = width; - - if (gridster.loaded) { - $elem.removeClass('gridster-loaded'); - } - - refresh(); - - if (gridster.loaded) { - $elem.addClass('gridster-loaded'); - } - - scope.$parent.$broadcast('gridster-resized', [width, $elem.offsetHeight]); - } - - // track element width changes any way we can - function onResize() { - resize(); - $timeout(function() { - scope.$apply(); - }); - } - if (typeof $elem.resize === 'function') { - $elem.resize(onResize); - } - var $win = angular.element($window); - $win.on('resize', onResize); - - scope.$watch(function() { - return $elem[0].offsetWidth || parseInt($elem.css('width'), 10); - }, resize); - - // be sure to cleanup - scope.$on('$destroy', function() { - gridster.destroy(); - $win.off('resize', onResize); - }); - - // allow a little time to place items before floating up - $timeout(function() { - scope.$watch('gridster.floating', function() { - gridster.floatItemsUp(); - }); - gridster.loaded = true; - }, 100); - - - - // Custom code - - /** - * Callback called when starting to drag from palette to canvas. - */ - $rootScope.startDragCallback = function (event, ui) { - $timeout(function () { - var fieldId = event.target.id; - var fieldType; - - var colspan = 1; - if (fieldId === 'group' || fieldId === 'dynamic-table') { - colspan = 2; - } - - var numberOfRows = 1; - if (fieldId === 'multi-line-text') { - numberOfRows = 2; - } else if (fieldId === 'dynamic-table') { - numberOfRows = 2; - } - - scope.startDragItem = { - type: fieldId, - fieldType: fieldType, - name: 'Label', - required: false, - readOnly: false, - sizeX: colspan, - sizeY: numberOfRows, - row: -1, - col: -1 - }; - - if (fieldId === 'radio-buttons' || fieldId === 'dropdown') { - scope.startDragItem.options = [ - {name: 'Option 1'} - ]; - } - - }, 0); - }; - - /** - * Callback called when stopping to drag from palette to canvas. - */ - $rootScope.dropCallback = function (event, ui) { - $timeout(function () { - gridster.movingItem = null; - var offset = jQuery($elem[0]).offset(); - var row = gridster.pixelsToRows(event.clientY - offset.top, true) - 1; - var column = gridster.pixelsToColumns(event.clientX - offset.left, true) - 1; - if (row >= 0 && column >= 0) { - - scope.startDragItem.row = row; - scope.startDragItem.col = column; - } - }, 0); - }; - - /** - * Callback called during dragging from palette to canvas. - */ - $rootScope.dragCallback = function (event, ui) { - - var offset = jQuery($elem[0]).offset(); - var row = gridster.pixelsToRows(event.clientY - offset.top, true) - 1; - var column = gridster.pixelsToColumns(event.clientX - offset.left, true) - 1; - - if (!scope.startDragItem) { - return; - } - - if (scope.startDragItem.row === row && scope.startDragItem.col === column) { - return; - } - - if ( ((scope.startDragItem.row === -1 || scope.startDragItem.col === -1) && row >= 0 && column >= 0) - || (scope.startDragItem.row >= 0 && scope.startDragItem.col >= 0 && (row < 0 || column < 0)) ) { - $timeout(function () { - if ((scope.startDragItem.row === -1 || scope.startDragItem.col === -1) && row >= 0 && column >= 0) { - scope.$parent.formItems.push(scope.startDragItem); - - gridster.movingItem = scope.startDragItem; - gridster.updateHeight(1); - } - - if (scope.startDragItem.row >= 0 && scope.startDragItem.col >= 0 && (row < 0 || column < 0)) { - scope.$parent.formItems.pop(); - gridster.movingItem = null; - } - - - }, 0); - } - - $timeout(function () { - scope.startDragItem.row = row; - scope.startDragItem.col = column; - }, 0); - - }; - - // END custom code - - - }; - } - }; - } - ]) - - .controller('GridsterItemCtrl', function() { - this.$element = null; - this.gridster = null; - this.row = null; - this.col = null; - this.sizeX = null; - this.sizeY = null; - this.minSizeX = 0; - this.minSizeY = 0; - this.maxSizeX = null; - this.maxSizeY = null; - - this.init = function($element, gridster) { - this.$element = $element; - this.gridster = gridster; - this.sizeX = gridster.defaultSizeX; - this.sizeY = gridster.defaultSizeY; - }; - - this.destroy = function() { - this.gridster = null; - this.$element = null; - }; - - /** - * Returns the items most important attributes - */ - this.toJSON = function() { - return { - row: this.row, - col: this.col, - sizeY: this.sizeY, - sizeX: this.sizeX - }; - }; - - this.isMoving = function() { - return this.gridster.movingItem === this; - }; - - /** - * Set the items position - * - * @param {number} row - * @param {number} column - */ - this.setPosition = function(row, column) { - this.gridster.putItem(this, row, column); - - if (!this.isMoving()) { - this.setElementPosition(); - } - }; - - /** - * Sets a specified size property - * - * @param {string} key Can be either "x" or "y" - * @param {number} value The size amount - */ - this.setSize = function(key, value, preventMove) { - key = key.toUpperCase(); - var camelCase = 'size' + key, - titleCase = 'Size' + key; - if (value === '') { - return; - } - value = parseInt(value, 10); - if (isNaN(value) || value === 0) { - value = this.gridster['default' + titleCase]; - } - var max = key === 'X' ? this.gridster.columns : this.gridster.maxRows; - if (this['max' + titleCase]) { - max = Math.min(this['max' + titleCase], max); - } - if (this.gridster['max' + titleCase]) { - max = Math.min(this.gridster['max' + titleCase], max); - } - if (key === 'X' && this.cols) { - max -= this.cols; - } else if (key === 'Y' && this.rows) { - max -= this.rows; - } - - var min = 0; - if (this['min' + titleCase]) { - min = Math.max(this['min' + titleCase], min); - } - if (this.gridster['min' + titleCase]) { - min = Math.max(this.gridster['min' + titleCase], min); - } - - value = Math.max(Math.min(value, max), min); - - var changed = (this[camelCase] !== value || (this['old' + titleCase] && this['old' + titleCase] !== value)); - this['old' + titleCase] = this[camelCase] = value; - - if (!this.isMoving()) { - this['setElement' + titleCase](); - } - if (!preventMove && changed) { - this.gridster.moveOverlappingItems(this); - this.gridster.layoutChanged(); - } - - return changed; - }; - - /** - * Sets the items sizeY property - * - * @param {number} rows - */ - this.setSizeY = function(rows, preventMove) { - return this.setSize('Y', rows, preventMove); - }; - - /** - * Sets the items sizeX property - * - * @param {number} rows - */ - this.setSizeX = function(columns, preventMove) { - return this.setSize('X', columns, preventMove); - }; - - /** - * Sets an elements position on the page - * - * @param {number} row - * @param {number} column - */ - this.setElementPosition = function() { - if (this.gridster.isMobile) { - this.$element.css({ - marginLeft: this.gridster.margins[0] + 'px', - marginRight: this.gridster.margins[0] + 'px', - marginTop: this.gridster.margins[1] + 'px', - marginBottom: this.gridster.margins[1] + 'px', - top: '', - left: '' - }); - } else { - this.$element.css({ - margin: 0, - top: (this.row * this.gridster.curRowHeight + (this.gridster.outerMargin ? this.gridster.margins[0] : 0)) + 'px', - left: (this.col * this.gridster.curColWidth + (this.gridster.outerMargin ? this.gridster.margins[1] : 0)) + 'px' - }); - } - }; - - /** - * Sets an elements height - */ - this.setElementSizeY = function() { - if (this.gridster.isMobile && !this.gridster.saveGridItemCalculatedHeightInMobile) { - this.$element.css('height', ''); - } else { - this.$element.css('height', (this.sizeY * this.gridster.curRowHeight - this.gridster.margins[0]) + 'px'); - } - }; - - /** - * Sets an elements width - */ - this.setElementSizeX = function() { - if (this.gridster.isMobile) { - this.$element.css('width', ''); - } else { - this.$element.css('width', (this.sizeX * this.gridster.curColWidth - this.gridster.margins[1]) + 'px'); - } - }; - - /** - * Gets an element's width - */ - this.getElementSizeX = function() { - return (this.sizeX * this.gridster.curColWidth - this.gridster.margins[1]); - }; - - /** - * Gets an element's height - */ - this.getElementSizeY = function() { - return (this.sizeY * this.gridster.curRowHeight - this.gridster.margins[0]); - }; - - }) - - .factory('GridsterDraggable', ['$document', '$timeout', '$window', - function($document, $timeout, $window) { - function GridsterDraggable($el, scope, gridster, item, itemOptions) { - - var elmX, elmY, elmW, elmH, - - mouseX = 0, - mouseY = 0, - lastMouseX = 0, - lastMouseY = 0, - mOffX = 0, - mOffY = 0, - - minTop = 0, - maxTop = 9999, - minLeft = 0, - realdocument = $document[0]; - - var originalCol, originalRow; - var inputTags = ['select', 'input', 'textarea', 'button']; - - function mouseDown(e) { - if (inputTags.indexOf(e.target.nodeName.toLowerCase()) !== -1) { - return false; - } - - // exit, if a resize handle was hit - if (angular.element(e.target).hasClass('gridster-item-resizable-handler')) { - return false; - } - - // exit, if the target has it's own click event - if (angular.element(e.target).attr('onclick') || angular.element(e.target).attr('ng-click')) { - return false; - } - - switch (e.which) { - case 1: - // left mouse button - break; - case 2: - case 3: - // right or middle mouse button - return; - } - - lastMouseX = e.pageX; - lastMouseY = e.pageY; - - elmX = parseInt($el.css('left'), 10); - elmY = parseInt($el.css('top'), 10); - elmW = $el[0].offsetWidth; - elmH = $el[0].offsetHeight; - - originalCol = item.col; - originalRow = item.row; - - dragStart(e); - - return true; - } - - function mouseMove(e) { - if (!$el.hasClass('gridster-item-moving') || $el.hasClass('gridster-item-resizing')) { - return false; - } - - var maxLeft = gridster.curWidth - 1; - - // Get the current mouse position. - mouseX = e.pageX; - mouseY = e.pageY; - - // Get the deltas - var diffX = mouseX - lastMouseX + mOffX; - var diffY = mouseY - lastMouseY + mOffY; - mOffX = mOffY = 0; - - // Update last processed mouse positions. - lastMouseX = mouseX; - lastMouseY = mouseY; - - var dX = diffX, - dY = diffY; - if (elmX + dX < minLeft) { - diffX = minLeft - elmX; - mOffX = dX - diffX; - } else if (elmX + elmW + dX > maxLeft) { - diffX = maxLeft - elmX - elmW; - mOffX = dX - diffX; - } - - if (elmY + dY < minTop) { - diffY = minTop - elmY; - mOffY = dY - diffY; - } else if (elmY + elmH + dY > maxTop) { - diffY = maxTop - elmY - elmH; - mOffY = dY - diffY; - } - elmX += diffX; - elmY += diffY; - - // set new position - $el.css({ - 'top': elmY + 'px', - 'left': elmX + 'px' - }); - - drag(e); - - return true; - } - - function mouseUp(e) { - if (!$el.hasClass('gridster-item-moving') || $el.hasClass('gridster-item-resizing')) { - return false; - } - - mOffX = mOffY = 0; - - dragStop(e); - - return true; - } - - function dragStart(event) { - $el.addClass('gridster-item-moving'); - gridster.movingItem = item; - - gridster.updateHeight(item.sizeY); - scope.$apply(function() { - if (gridster.draggable && gridster.draggable.start) { - gridster.draggable.start(event, $el, itemOptions); - } - }); - } - - function drag(event) { - var oldRow = item.row, - oldCol = item.col, - hasCallback = gridster.draggable && gridster.draggable.drag, - scrollSensitivity = gridster.draggable.scrollSensitivity, - scrollSpeed = gridster.draggable.scrollSpeed; - - var row = gridster.pixelsToRows(elmY); - var col = gridster.pixelsToColumns(elmX); - - var itemsInTheWay = gridster.getItems(row, col, item.sizeX, item.sizeY, item); - var hasItemsInTheWay = itemsInTheWay.length !== 0; - - if (gridster.swapping === true && hasItemsInTheWay) { - var boundingBoxItem = gridster.getBoundingBox(itemsInTheWay); - var sameSize = boundingBoxItem.sizeX === item.sizeX && boundingBoxItem.sizeY === item.sizeY; - var sameRow = boundingBoxItem.row === row; - var sameCol = boundingBoxItem.col === col; - var samePosition = sameRow && sameCol; - var inline = sameRow || sameCol; - - if (sameSize && itemsInTheWay.length === 1) { - if (samePosition) { - gridster.swapItems(item, itemsInTheWay[0]); - } else if (inline) { - return; - } - } else if (boundingBoxItem.sizeX <= item.sizeX && boundingBoxItem.sizeY <= item.sizeY && inline) { - var emptyRow = item.row <= row ? item.row : row + item.sizeY; - var emptyCol = item.col <= col ? item.col : col + item.sizeX; - var rowOffset = emptyRow - boundingBoxItem.row; - var colOffset = emptyCol - boundingBoxItem.col; - - for (var i = 0, l = itemsInTheWay.length; i < l; ++i) { - var itemInTheWay = itemsInTheWay[i]; - - var itemsInFreeSpace = gridster.getItems( - itemInTheWay.row + rowOffset, - itemInTheWay.col + colOffset, - itemInTheWay.sizeX, - itemInTheWay.sizeY, - item - ); - - if (itemsInFreeSpace.length === 0) { - gridster.putItem(itemInTheWay, itemInTheWay.row + rowOffset, itemInTheWay.col + colOffset); - } - } - } - } - - if (gridster.pushing !== false || !hasItemsInTheWay) { - item.row = row; - item.col = col; - } - - if (event.pageY - realdocument.body.scrollTop < scrollSensitivity) { - realdocument.body.scrollTop = realdocument.body.scrollTop - scrollSpeed; - } else if ($window.innerHeight - (event.pageY - realdocument.body.scrollTop) < scrollSensitivity) { - realdocument.body.scrollTop = realdocument.body.scrollTop + scrollSpeed; - } - - if (event.pageX - realdocument.body.scrollLeft < scrollSensitivity) { - realdocument.body.scrollLeft = realdocument.body.scrollLeft - scrollSpeed; - } else if ($window.innerWidth - (event.pageX - realdocument.body.scrollLeft) < scrollSensitivity) { - realdocument.body.scrollLeft = realdocument.body.scrollLeft + scrollSpeed; - } - - if (hasCallback || oldRow !== item.row || oldCol !== item.col) { - scope.$apply(function() { - if (hasCallback) { - gridster.draggable.drag(event, $el, itemOptions); - } - }); - } - } - - function dragStop(event) { - $el.removeClass('gridster-item-moving'); - var row = gridster.pixelsToRows(elmY); - var col = gridster.pixelsToColumns(elmX); - if (gridster.pushing !== false || gridster.getItems(row, col, item.sizeX, item.sizeY, item).length === 0) { - item.row = row; - item.col = col; - } - gridster.movingItem = null; - item.setPosition(item.row, item.col); - - scope.$apply(function() { - if (gridster.draggable && gridster.draggable.stop) { - gridster.draggable.stop(event, $el, itemOptions); - } - }); - } - - var enabled = false; - var $dragHandle = null; - var unifiedInput; - - this.enable = function() { - var self = this; - // disable and timeout required for some template rendering - $timeout(function() { - self.disable(); - - if (gridster.draggable && gridster.draggable.handle) { - $dragHandle = angular.element($el[0].querySelector(gridster.draggable.handle)); - if ($dragHandle.length === 0) { - // fall back to element if handle not found... - $dragHandle = $el; - } - } else { - $dragHandle = $el; - } - - unifiedInput = new gridster.unifiedInput($dragHandle[0], mouseDown, mouseMove, mouseUp); - unifiedInput.enable(); - - enabled = true; - }); - }; - - this.disable = function() { - if (!enabled) { - return; - } - - unifiedInput.disable(); - unifiedInput = undefined; - enabled = false; - }; - - this.toggle = function(enabled) { - if (enabled) { - this.enable(); - } else { - this.disable(); - } - }; - - this.destroy = function() { - this.disable(); - }; - } - - return GridsterDraggable; - } - ]) - - .factory('GridsterResizable', [ - function() { - function GridsterResizable($el, scope, gridster, item, itemOptions) { - - function ResizeHandle(handleClass) { - - var hClass = handleClass; - - var elmX, elmY, elmW, elmH, - - mouseX = 0, - mouseY = 0, - lastMouseX = 0, - lastMouseY = 0, - mOffX = 0, - mOffY = 0, - - minTop = 0, - maxTop = 9999, - minLeft = 0; - - var getMinHeight = function() { - return gridster.curRowHeight - gridster.margins[0]; - }; - var getMinWidth = function() { - return gridster.curColWidth - gridster.margins[1]; - }; - - var originalWidth, originalHeight; - var savedDraggable; - - function mouseDown(e) { - switch (e.which) { - case 1: - // left mouse button - break; - case 2: - case 3: - // right or middle mouse button - return; - } - - // save the draggable setting to restore after resize - savedDraggable = gridster.draggable.enabled; - if (savedDraggable) { - gridster.draggable.enabled = false; - scope.$broadcast('gridster-draggable-changed'); - } - - // Get the current mouse position. - lastMouseX = e.pageX; - lastMouseY = e.pageY; - - // Record current widget dimensions - elmX = parseInt($el.css('left'), 10); - elmY = parseInt($el.css('top'), 10); - elmW = $el[0].offsetWidth; - elmH = $el[0].offsetHeight; - - originalWidth = item.sizeX; - originalHeight = item.sizeY; - - resizeStart(e); - - return true; - } - - function resizeStart(e) { - $el.addClass('gridster-item-moving'); - $el.addClass('gridster-item-resizing'); - - gridster.movingItem = item; - - item.setElementSizeX(); - item.setElementSizeY(); - item.setElementPosition(); - gridster.updateHeight(1); - - scope.$apply(function() { - // callback - if (gridster.resizable && gridster.resizable.start) { - gridster.resizable.start(e, $el, itemOptions); // options is the item model - } - }); - } - - function mouseMove(e) { - var maxLeft = gridster.curWidth - 1; - - // Get the current mouse position. - mouseX = e.pageX; - mouseY = e.pageY; - - // Get the deltas - var diffX = mouseX - lastMouseX + mOffX; - var diffY = mouseY - lastMouseY + mOffY; - mOffX = mOffY = 0; - - // Update last processed mouse positions. - lastMouseX = mouseX; - lastMouseY = mouseY; - - var dY = diffY, - dX = diffX; - - if (hClass.indexOf('n') >= 0) { - if (elmH - dY < getMinHeight()) { - diffY = elmH - getMinHeight(); - mOffY = dY - diffY; - } else if (elmY + dY < minTop) { - diffY = minTop - elmY; - mOffY = dY - diffY; - } - elmY += diffY; - elmH -= diffY; - } - if (hClass.indexOf('s') >= 0) { - if (elmH + dY < getMinHeight()) { - diffY = getMinHeight() - elmH; - mOffY = dY - diffY; - } else if (elmY + elmH + dY > maxTop) { - diffY = maxTop - elmY - elmH; - mOffY = dY - diffY; - } - elmH += diffY; - } - if (hClass.indexOf('w') >= 0) { - if (elmW - dX < getMinWidth()) { - diffX = elmW - getMinWidth(); - mOffX = dX - diffX; - } else if (elmX + dX < minLeft) { - diffX = minLeft - elmX; - mOffX = dX - diffX; - } - elmX += diffX; - elmW -= diffX; - } - if (hClass.indexOf('e') >= 0) { - if (elmW + dX < getMinWidth()) { - diffX = getMinWidth() - elmW; - mOffX = dX - diffX; - } else if (elmX + elmW + dX > maxLeft) { - diffX = maxLeft - elmX - elmW; - mOffX = dX - diffX; - } - elmW += diffX; - } - - // set new position - $el.css({ - 'top': elmY + 'px', - 'left': elmX + 'px', - 'width': elmW + 'px', - 'height': elmH + 'px' - }); - - resize(e); - - return true; - } - - function mouseUp(e) { - // restore draggable setting to its original state - if (gridster.draggable.enabled !== savedDraggable) { - gridster.draggable.enabled = savedDraggable; - scope.$broadcast('gridster-draggable-changed'); - } - - mOffX = mOffY = 0; - - resizeStop(e); - - return true; - } - - function resize(e) { - var oldRow = item.row, - oldCol = item.col, - oldSizeX = item.sizeX, - oldSizeY = item.sizeY, - hasCallback = gridster.resizable && gridster.resizable.resize; - - var col = item.col; - // only change column if grabbing left edge - if (['w', 'nw', 'sw'].indexOf(handleClass) !== -1) { - col = gridster.pixelsToColumns(elmX, false); - } - - var row = item.row; - // only change row if grabbing top edge - if (['n', 'ne', 'nw'].indexOf(handleClass) !== -1) { - row = gridster.pixelsToRows(elmY, false); - } - - var sizeX = item.sizeX; - // only change row if grabbing left or right edge - if (['n', 's'].indexOf(handleClass) === -1) { - sizeX = gridster.pixelsToColumns(elmW, true); - } - - var sizeY = item.sizeY; - // only change row if grabbing top or bottom edge - if (['e', 'w'].indexOf(handleClass) === -1) { - sizeY = gridster.pixelsToRows(elmH, true); - } - - if (gridster.pushing !== false || gridster.getItems(row, col, sizeX, sizeY, item).length === 0) { - item.row = row; - item.col = col; - item.sizeX = sizeX; - item.sizeY = sizeY; - } - var isChanged = item.row !== oldRow || item.col !== oldCol || item.sizeX !== oldSizeX || item.sizeY !== oldSizeY; - - if (hasCallback || isChanged) { - scope.$apply(function() { - if (hasCallback) { - gridster.resizable.resize(e, $el, itemOptions); // options is the item model - } - }); - } - } - - function resizeStop(e) { - $el.removeClass('gridster-item-moving'); - $el.removeClass('gridster-item-resizing'); - - gridster.movingItem = null; - - item.setPosition(item.row, item.col); - item.setSizeY(item.sizeY); - item.setSizeX(item.sizeX); - - scope.$apply(function() { - if (gridster.resizable && gridster.resizable.stop) { - gridster.resizable.stop(e, $el, itemOptions); // options is the item model - } - }); - } - - var $dragHandle = null; - var unifiedInput; - - this.enable = function() { - if (!$dragHandle) { - $dragHandle = angular.element('
    '); - $el.append($dragHandle); - } - - unifiedInput = new gridster.unifiedInput($dragHandle[0], mouseDown, mouseMove, mouseUp); - unifiedInput.enable(); - }; - - this.disable = function() { - if ($dragHandle) { - $dragHandle.remove(); - $dragHandle = null; - } - - unifiedInput.disable(); - unifiedInput = undefined; - }; - - this.destroy = function() { - this.disable(); - }; - } - - var handles = []; - var handlesOpts = gridster.resizable.handles; - if (typeof handlesOpts === 'string') { - handlesOpts = gridster.resizable.handles.split(','); - } - var enabled = false; - - for (var c = 0, l = handlesOpts.length; c < l; c++) { - handles.push(new ResizeHandle(handlesOpts[c])); - } - - this.enable = function() { - if (enabled) { - return; - } - for (var c = 0, l = handles.length; c < l; c++) { - handles[c].enable(); - } - enabled = true; - }; - - this.disable = function() { - if (!enabled) { - return; - } - for (var c = 0, l = handles.length; c < l; c++) { - handles[c].disable(); - } - enabled = false; - }; - - this.toggle = function(enabled) { - if (enabled) { - this.enable(); - } else { - this.disable(); - } - }; - - this.destroy = function() { - for (var c = 0, l = handles.length; c < l; c++) { - handles[c].destroy(); - } - }; - } - return GridsterResizable; - } - ]) - - /** - * GridsterItem directive - */ - .directive('gridsterItem', ['$parse', 'GridsterDraggable', 'GridsterResizable', - function($parse, GridsterDraggable, GridsterResizable) { - return { - restrict: 'EA', - controller: 'GridsterItemCtrl', - require: ['^gridster', 'gridsterItem'], - link: function(scope, $el, attrs, controllers) { - var optionsKey = attrs.gridsterItem, - options; - - var gridster = controllers[0], - item = controllers[1]; - - // bind the item's position properties - if (optionsKey) { - var $optionsGetter = $parse(optionsKey); - options = $optionsGetter(scope) || {}; - if (!options && $optionsGetter.assign) { - options = { - row: item.row, - col: item.col, - sizeX: item.sizeX, - sizeY: item.sizeY, - minSizeX: 0, - minSizeY: 0, - maxSizeX: null, - maxSizeY: null - }; - $optionsGetter.assign(scope, options); - } - } else { - options = attrs; - } - - item.init($el, gridster); - - $el.addClass('gridster-item'); - - var aspects = ['minSizeX', 'maxSizeX', 'minSizeY', 'maxSizeY', 'sizeX', 'sizeY', 'row', 'col'], - $getters = {}; - - var aspectFn = function(aspect) { - var key; - if (typeof options[aspect] === 'string') { - key = options[aspect]; - } else if (typeof options[aspect.toLowerCase()] === 'string') { - key = options[aspect.toLowerCase()]; - } else if (optionsKey) { - key = $parse(optionsKey + '.' + aspect); - } else { - return; - } - $getters[aspect] = $parse(key); - - // when the value changes externally, update the internal item object - scope.$watch(key, function(newVal) { - newVal = parseInt(newVal, 10); - if (!isNaN(newVal)) { - item[aspect] = newVal; - } - }); - - // initial set - var val = $getters[aspect](scope); - if (typeof val === 'number') { - item[aspect] = val; - } - }; - - for (var i = 0, l = aspects.length; i < l; ++i) { - aspectFn(aspects[i]); - } - - scope.$broadcast('gridster-item-initialized', [item.sizeY, item.sizeX, item.getElementSizeY(), item.getElementSizeX()]); - - function positionChanged() { - // call setPosition so the element and gridster controller are updated - item.setPosition(item.row, item.col); - - // when internal item position changes, update externally bound values - if ($getters.row && $getters.row.assign) { - $getters.row.assign(scope, item.row); - } - if ($getters.col && $getters.col.assign) { - $getters.col.assign(scope, item.col); - } - } - scope.$watch(function() { - return item.row + ',' + item.col; - }, positionChanged); - - function sizeChanged() { - var changedX = item.setSizeX(item.sizeX, true); - if (changedX && $getters.sizeX && $getters.sizeX.assign) { - $getters.sizeX.assign(scope, item.sizeX); - } - var changedY = item.setSizeY(item.sizeY, true); - if (changedY && $getters.sizeY && $getters.sizeY.assign) { - $getters.sizeY.assign(scope, item.sizeY); - } - - if (changedX || changedY) { - item.gridster.moveOverlappingItems(item); - gridster.layoutChanged(); - } - } - scope.$watch(function() { - return item.sizeY + ',' + item.sizeX + '|' + item.minSizeX + ',' + item.maxSizeX + ',' + item.minSizeY + ',' + item.maxSizeY; - }, sizeChanged); - - var draggable = new GridsterDraggable($el, scope, gridster, item, options); - var resizable = new GridsterResizable($el, scope, gridster, item, options); - - scope.$on('gridster-draggable-changed', function() { - draggable.toggle(!gridster.isMobile && gridster.draggable && gridster.draggable.enabled); - }); - scope.$on('gridster-resizable-changed', function() { - resizable.toggle(!gridster.isMobile && gridster.resizable && gridster.resizable.enabled); - }); - scope.$on('gridster-resized', function() { - resizable.toggle(!gridster.isMobile && gridster.resizable && gridster.resizable.enabled); - }); - scope.$watch(function() { - return gridster.isMobile; - }, function() { - resizable.toggle(!gridster.isMobile && gridster.resizable && gridster.resizable.enabled); - draggable.toggle(!gridster.isMobile && gridster.draggable && gridster.draggable.enabled); - }); - - function whichTransitionEvent() { - var el = document.createElement('div'); - var transitions = { - 'transition': 'transitionend', - 'OTransition': 'oTransitionEnd', - 'MozTransition': 'transitionend', - 'WebkitTransition': 'webkitTransitionEnd' - }; - for (var t in transitions) { - if (el.style[t] !== undefined) { - return transitions[t]; - } - } - } - - $el.on(whichTransitionEvent(), function() { - scope.$apply(function() { - scope.$broadcast('gridster-item-transition-end'); - }); - }); - - return scope.$on('$destroy', function() { - try { - resizable.destroy(); - draggable.destroy(); - } catch (e) {} - - try { - gridster.removeItem(item); - } catch (e) {} - - try { - item.destroy(); - } catch (e) {} - }); - } - }; - } - ]) - - ; - -})(angular); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.min.css b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.min.css deleted file mode 100644 index 39766807..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.min.css +++ /dev/null @@ -1 +0,0 @@ -.gridster{position:relative;margin:auto;height:0}.gridster-content>ul{margin:0;list-style:none;padding:0}.gridster-item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;list-style:none;z-index:2;position:absolute;display:none}.gridster-loaded{-webkit-transition:height .3s;-moz-transition:height .3s;-o-transition:height .3s;transition:height .3s}.gridster-loaded .gridster-item{display:block;position:absolute;-webkit-transition:opacity .3s, left .3s, top .3s, width .3s, height .3s;-moz-transition:opacity .3s, left .3s, top .3s, width .3s, height .3s;-o-transition:opacity .3s, left .3s, top .3s, width .3s, height .3s;transition:opacity .3s, left .3s, top .3s, width .3s, height .3s}.gridster-mobile{height:auto !important}.gridster-mobile .gridster-item{height:auto;position:static;float:none}.gridster-preview-holder{display:none;z-index:1;position:absolute;background-color:#ddd;border-color:#fff;opacity:0.2}.gridster-item.gridster-item-moving,.gridster-item.gridster-preview-holder{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.gridster-item.ng-leave.ng-leave-active{opacity:0}.gridster-item.ng-enter{opacity:1}.gridster-item-moving{z-index:3}.gridster-item-resizable-handler{position:absolute;font-size:1px;display:block}.handle-se{cursor:se-resize;width:0;height:0;right:1px;bottom:1px;border-style:solid;border-width:0 0 12px 12px;border-color:transparent}.handle-ne{cursor:ne-resize;width:12px;height:12px;right:1px;top:1px}.handle-nw{cursor:nw-resize;width:12px;height:12px;left:1px;top:1px}.handle-sw{cursor:sw-resize;width:12px;height:12px;left:1px;bottom:1px}.handle-e{cursor:e-resize;width:12px;bottom:0;right:1px;top:0}.handle-s{cursor:s-resize;height:12px;right:0;bottom:1px;left:0}.handle-n{cursor:n-resize;height:12px;right:0;top:1px;left:0}.handle-w{cursor:w-resize;width:12px;left:1px;top:0;bottom:0}.gridster .gridster-item:hover .gridster-box{border:1.5px solid #B3B2B3}.gridster .gridster-item:hover .handle-se{border-color:transparent transparent #ccc} \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.min.js deleted file mode 100644 index 79eb6a67..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-gridster_0.11.7/angular-gridster.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - * angular-gridster - * http://manifestwebdesign.github.io/angular-gridster - * - * @version: 0.11.7 - * @license: MIT - */ -!function(a){"use strict";a.module("gridster",[]).constant("gridsterConfig",{columns:6,pushing:!0,floating:!0,swapping:!1,width:"auto",colWidth:"auto",rowHeight:"match",margins:[10,10],outerMargin:!0,isMobile:!1,mobileBreakPoint:600,mobileModeEnabled:!0,minColumns:1,minRows:1,maxRows:100,defaultSizeX:2,defaultSizeY:1,minSizeX:1,maxSizeX:null,minSizeY:1,maxSizeY:null,saveGridItemCalculatedHeightInMobile:!1,resizable:{enabled:!0,handles:["s","e","n","w","se","ne","sw","nw"]},draggable:{enabled:!0,scrollSensitivity:20,scrollSpeed:15}}).controller("GridsterCtrl",["gridsterConfig","$timeout",function(b,c){var d=this;a.extend(this,b),this.resizable=a.extend({},b.resizable||{}),this.draggable=a.extend({},b.draggable||{});var e=!1;this.layoutChanged=function(){e||(e=!0,c(function(){e=!1,d.loaded&&d.floatItemsUp(),d.updateHeight(d.movingItem?d.movingItem.sizeY:0)}))},this.grid=[],this.destroy=function(){this.grid&&(this.grid.length=0,this.grid=null)},this.setOptions=function(b){if(b)if(b=a.extend({},b),b.draggable&&(a.extend(this.draggable,b.draggable),delete b.draggable),b.resizable&&(a.extend(this.resizable,b.resizable),delete b.resizable),a.extend(this,b),this.margins&&2===this.margins.length)for(var c=0,d=this.margins.length;d>c;++c)this.margins[c]=parseInt(this.margins[c],10),isNaN(this.margins[c])&&(this.margins[c]=0);else this.margins=[0,0]},this.canItemOccupy=function(a,b,c){return b>-1&&c>-1&&a.sizeX+c<=this.columns&&a.sizeY+b<=this.maxRows},this.autoSetItemPosition=function(a){for(var b=0;bg;++g)for(var h=0;c>h;++h){var i=this.getItem(a+g,b+h,e);!i||e&&-1!==e.indexOf(i)||-1!==f.indexOf(i)||f.push(i)}return f},this.getBoundingBox=function(a){if(0===a.length)return null;if(1===a.length)return{row:a[0].row,col:a[0].col,sizeY:a[0].sizeY,sizeX:a[0].sizeX};for(var b=0,c=0,d=9999,e=9999,f=0,g=a.length;g>f;++f){var h=a[f];d=Math.min(h.row,d),e=Math.min(h.col,e),b=Math.max(h.row+h.sizeY,b),c=Math.max(h.col+h.sizeX,c)}return{row:d,col:e,sizeY:b-d,sizeX:c-e}},this.removeItem=function(a){for(var b=0,c=this.grid.length;c>b;++b){var d=this.grid[b];if(d){var e=d.indexOf(a);if(-1!==e){d[e]=null;break}}}this.layoutChanged()},this.getItem=function(a,b,c){!c||c instanceof Array||(c=[c]);for(var d=1;a>-1;){for(var e=1,f=b;f>-1;){var g=this.grid[a];if(g){var h=g[f];if(h&&(!c||-1===c.indexOf(h))&&h.sizeX>=e&&h.sizeY>=d)return h}++e,--f}--a,++d}return null},this.putItems=function(a){for(var b=0,c=a.length;c>b;++b)this.putItem(a[b])},this.putItem=function(a,b,c,d){if(("undefined"==typeof b||null===b)&&(b=a.row,c=a.col,"undefined"==typeof b||null===b))return void this.autoSetItemPosition(a);if(this.canItemOccupy(a,b,c)||(c=Math.min(this.columns-a.sizeX,Math.max(0,c)),b=Math.min(this.maxRows-a.sizeY,Math.max(0,b))),null!==a.oldRow&&"undefined"!=typeof a.oldRow){var e=a.oldRow===b&&a.oldColumn===c,f=this.grid[b]&&this.grid[b][c]===a;if(e&&f)return a.row=b,void(a.col=c);var g=this.grid[a.oldRow];g&&g[a.oldColumn]===a&&delete g[a.oldColumn]}a.oldRow=a.row=b,a.oldColumn=a.col=c,this.moveOverlappingItems(a,d),this.grid[b]||(this.grid[b]=[]),this.grid[b][c]=a,this.movingItem===a&&this.floatItemUp(a),this.layoutChanged()},this.swapItems=function(a,b){this.grid[a.row][a.col]=b,this.grid[b.row][b.col]=a;var c=a.row,d=a.col;a.row=b.row,a.col=b.col,b.row=c,b.col=d},this.moveOverlappingItems=function(a,b){b?-1===b.indexOf(a)&&(b=b.slice(0),b.push(a)):b=[a];var c=this.getItems(a.row,a.col,a.sizeX,a.sizeY,b);this.moveItemsDown(c,a.row+a.sizeY,b)},this.moveItemsDown=function(a,b,c){if(a&&0!==a.length){a.sort(function(a,b){return a.row-b.row}),c=c?c.slice(0):[];var d,e,f,g={};for(e=0,f=a.length;f>e;++e){d=a[e];var h=g[d.col];("undefined"==typeof h||d.rowe;++e){d=a[e];var i=b-g[d.col];this.moveItemDown(d,d.row+i,c),c.push(d)}}},this.moveItemDown=function(a,b,c){if(!(a.row>=b)){for(;a.rowa;++a){var c=this.grid[a];if(c)for(var d=0,e=c.length;e>d;++d){var f=c[d];f&&this.floatItemUp(f)}}},this.floatItemUp=function(a){if(this.floating!==!1){for(var b=a.col,c=a.sizeY,d=a.sizeX,e=null,f=null,g=a.row-1;g>-1;){var h=this.getItems(g,b,d,c,a);if(0!==h.length)break;e=g,f=b,--g}null!==e&&this.putItem(a,e,f)}},this.updateHeight=function(a){var b=this.minRows;a=a||0;for(var c=this.grid.length;c>=0;--c){var d=this.grid[c];if(d)for(var e=0,f=d.length;f>e;++e)d[e]&&(b=Math.max(b,c+a+d[e].sizeY))}this.gridHeight=this.maxRows-b>0?Math.min(this.maxRows,b):Math.max(this.maxRows,b)},this.pixelsToRows=function(a,b){return b===!0?Math.ceil(a/this.curRowHeight):b===!1?Math.floor(a/this.curRowHeight):Math.round(a/this.curRowHeight)},this.pixelsToColumns=function(a,b){return b===!0?Math.ceil(a/this.curColWidth):b===!1?Math.floor(a/this.curColWidth):Math.round(a/this.curColWidth)},this.unifiedInput=function(a,b,c,d){var e,f,g={},h=function(a){if(Object.keys)return Object.keys(a).length;var b,c=0;for(b in a)++c;return c},i=function(a){for(var b=0,c=0,d=navigator.userAgent.match(/\bMSIE\b/),e=a;null!=e;e=e.offsetParent)d&&(!document.documentMode||document.documentMode<8)&&"relative"===e.currentStyle.position&&e.offsetParent&&"relative"===e.offsetParent.currentStyle.position&&e.offsetLeft===e.offsetParent.offsetLeft?c+=e.offsetTop:(b+=e.offsetLeft,c+=e.offsetTop);return{x:b,y:c}},j=i(a),k=function(e){if("mousemove"!==e.type||0!==h(g)){for(var f=!0,m=e.changedTouches?e.changedTouches:[e],n=0;n
    ',controller:"GridsterCtrl",controllerAs:"gridster",scope:{config:"=?gridster"},compile:function(){return function(e,f,g,h){function i(){var a=f[0].offsetWidth||parseInt(f.css("width"),10);a&&a!==m&&!h.movingItem&&(m=a,h.loaded&&f.removeClass("gridster-loaded"),k(),h.loaded&&f.addClass("gridster-loaded"),e.$parent.$broadcast("gridster-resized",[a,f.offsetHeight]))}function j(){i(),b(function(){e.$apply()})}h.loaded=!1,e.gridsterClass=function(){return{gridster:!0,"gridster-desktop":!h.isMobile,"gridster-mobile":h.isMobile,"gridster-loaded":h.loaded}},e.previewStyle=function(){return h.movingItem?{display:"block",height:h.movingItem.sizeY*h.curRowHeight-h.margins[0]+"px",width:h.movingItem.sizeX*h.curColWidth-h.margins[1]+"px",top:h.movingItem.row*h.curRowHeight+(h.outerMargin?h.margins[0]:0)+"px",left:h.movingItem.col*h.curColWidth+(h.outerMargin?h.margins[1]:0)+"px"}:{display:"none"}};var k=function(){h.setOptions(e.config),h.curWidth="auto"===h.width?f[0].offsetWidth||parseInt(f.css("width"),10):h.width,h.curColWidth="auto"===h.colWidth?(h.curWidth+(h.outerMargin?-h.margins[1]:h.margins[1]))/h.columns:h.colWidth,h.curRowHeight=h.rowHeight,"string"==typeof h.rowHeight&&("match"===h.rowHeight?h.curRowHeight=Math.round(h.curColWidth):-1!==h.rowHeight.indexOf("*")?h.curRowHeight=Math.round(h.curColWidth*h.rowHeight.replace("*","").replace(" ","")):-1!==h.rowHeight.indexOf("/")&&(h.curRowHeight=Math.round(h.curColWidth/h.rowHeight.replace("/","").replace(" ","")))),h.isMobile=h.mobileModeEnabled&&h.curWidth<=h.mobileBreakPoint;for(var a=0,b=h.grid.length;b>a;++a){var c=h.grid[a];if(c)for(var d=0,g=c.length;g>d;++d)if(c[d]){var i=c[d];i.setElementPosition(),i.setElementSizeY(),i.setElementSizeX()}}l()};e.$watch("config",k,!0),e.$watch("config.draggable",function(){c.$broadcast("gridster-draggable-changed")},!0),e.$watch("config.resizable",function(){c.$broadcast("gridster-resizable-changed")},!0);var l=function(){f.css("height",h.gridHeight*h.curRowHeight+(h.outerMargin?h.margins[0]:-h.margins[0])+"px")};e.$watch("gridster.gridHeight",l),e.$watch("gridster.movingItem",function(){h.updateHeight(h.movingItem?h.movingItem.sizeY:0)});var m=f[0].offsetWidth||parseInt(f.css("width"),10);"function"==typeof f.resize&&f.resize(j);var n=a.element(d);n.on("resize",j),e.$watch(function(){return f[0].offsetWidth||parseInt(f.css("width"),10)},i),e.$on("$destroy",function(){h.destroy(),n.off("resize",j)}),b(function(){e.$watch("gridster.floating",function(){h.floatItemsUp()}),h.loaded=!0},100)}}}}]).controller("GridsterItemCtrl",function(){this.$element=null,this.gridster=null,this.row=null,this.col=null,this.sizeX=null,this.sizeY=null,this.minSizeX=0,this.minSizeY=0,this.maxSizeX=null,this.maxSizeY=null,this.init=function(a,b){this.$element=a,this.gridster=b,this.sizeX=b.defaultSizeX,this.sizeY=b.defaultSizeY},this.destroy=function(){this.gridster=null,this.$element=null},this.toJSON=function(){return{row:this.row,col:this.col,sizeY:this.sizeY,sizeX:this.sizeX}},this.isMoving=function(){return this.gridster.movingItem===this},this.setPosition=function(a,b){this.gridster.putItem(this,a,b),this.isMoving()||this.setElementPosition()},this.setSize=function(a,b,c){a=a.toUpperCase();var d="size"+a,e="Size"+a;if(""!==b){b=parseInt(b,10),(isNaN(b)||0===b)&&(b=this.gridster["default"+e]);var f="X"===a?this.gridster.columns:this.gridster.maxRows;this["max"+e]&&(f=Math.min(this["max"+e],f)),this.gridster["max"+e]&&(f=Math.min(this.gridster["max"+e],f)),"X"===a&&this.cols?f-=this.cols:"Y"===a&&this.rows&&(f-=this.rows);var g=0;this["min"+e]&&(g=Math.max(this["min"+e],g)),this.gridster["min"+e]&&(g=Math.max(this.gridster["min"+e],g)),b=Math.max(Math.min(b,f),g);var h=this[d]!==b||this["old"+e]&&this["old"+e]!==b;return this["old"+e]=this[d]=b,this.isMoving()||this["setElement"+e](),!c&&h&&(this.gridster.moveOverlappingItems(this),this.gridster.layoutChanged()),h}},this.setSizeY=function(a,b){return this.setSize("Y",a,b)},this.setSizeX=function(a,b){return this.setSize("X",a,b)},this.setElementPosition=function(){this.$element.css(this.gridster.isMobile?{marginLeft:this.gridster.margins[0]+"px",marginRight:this.gridster.margins[0]+"px",marginTop:this.gridster.margins[1]+"px",marginBottom:this.gridster.margins[1]+"px",top:"",left:""}:{margin:0,top:this.row*this.gridster.curRowHeight+(this.gridster.outerMargin?this.gridster.margins[0]:0)+"px",left:this.col*this.gridster.curColWidth+(this.gridster.outerMargin?this.gridster.margins[1]:0)+"px"})},this.setElementSizeY=function(){this.gridster.isMobile&&!this.gridster.saveGridItemCalculatedHeightInMobile?this.$element.css("height",""):this.$element.css("height",this.sizeY*this.gridster.curRowHeight-this.gridster.margins[0]+"px")},this.setElementSizeX=function(){this.gridster.isMobile?this.$element.css("width",""):this.$element.css("width",this.sizeX*this.gridster.curColWidth-this.gridster.margins[1]+"px")},this.getElementSizeX=function(){return this.sizeX*this.gridster.curColWidth-this.gridster.margins[1]},this.getElementSizeY=function(){return this.sizeY*this.gridster.curRowHeight-this.gridster.margins[0]}}).factory("GridsterDraggable",["$document","$timeout","$window",function(b,c,d){function e(e,f,g,h,i){function j(b){if(-1!==G.indexOf(b.target.nodeName.toLowerCase()))return!1;if(a.element(b.target).hasClass("gridster-item-resizable-handler"))return!1;if(a.element(b.target).attr("onclick")||a.element(b.target).attr("ng-click"))return!1;switch(b.which){case 1:break;case 2:case 3:return}return y=b.pageX,z=b.pageY,p=parseInt(e.css("left"),10),q=parseInt(e.css("top"),10),r=e[0].offsetWidth,s=e[0].offsetHeight,t=h.col,u=h.row,m(b),!0}function k(a){if(!e.hasClass("gridster-item-moving")||e.hasClass("gridster-item-resizing"))return!1;var b=g.curWidth-1;w=a.pageX,x=a.pageY;var c=w-y+A,d=x-z+B;A=B=0,y=w,z=x;var f=c,h=d;return E>p+f?(c=E-p,A=f-c):p+r+f>b&&(c=b-p-r,A=f-c),C>q+h?(d=C-q,B=h-d):q+s+h>D&&(d=D-q-s,B=h-d),p+=c,q+=d,e.css({top:q+"px",left:p+"px"}),n(a),!0}function l(a){return!e.hasClass("gridster-item-moving")||e.hasClass("gridster-item-resizing")?!1:(A=B=0,o(a),!0)}function m(a){e.addClass("gridster-item-moving"),g.movingItem=h,g.updateHeight(h.sizeY),f.$apply(function(){g.draggable&&g.draggable.start&&g.draggable.start(a,e,i)})}function n(a){var b=h.row,c=h.col,j=g.draggable&&g.draggable.drag,k=g.draggable.scrollSensitivity,l=g.draggable.scrollSpeed,m=g.pixelsToRows(q),n=g.pixelsToColumns(p),o=g.getItems(m,n,h.sizeX,h.sizeY,h),r=0!==o.length;if(g.swapping===!0&&r){var s=g.getBoundingBox(o),t=s.sizeX===h.sizeX&&s.sizeY===h.sizeY,u=s.row===m,v=s.col===n,w=u&&v,x=u||v;if(t&&1===o.length){if(w)g.swapItems(h,o[0]);else if(x)return}else if(s.sizeX<=h.sizeX&&s.sizeY<=h.sizeY&&x)for(var y=h.row<=m?h.row:m+h.sizeY,z=h.col<=n?h.col:n+h.sizeX,A=y-s.row,B=z-s.col,C=0,D=o.length;D>C;++C){var E=o[C],G=g.getItems(E.row+A,E.col+B,E.sizeX,E.sizeY,h);0===G.length&&g.putItem(E,E.row+A,E.col+B)}}g.pushing===!1&&r||(h.row=m,h.col=n),a.pageY-F.body.scrollTop=0&&(q-go+g&&(f=C-o,B=g-f),o+=f,q-=f),v.indexOf("s")>=0&&(q+gD&&(f=D-o-q,B=g-f),q+=f),v.indexOf("w")>=0&&(p-hn+h&&(e=E-n,A=h-e),n+=e,p-=e),v.indexOf("e")>=0&&(p+hc&&(e=c-n-p,A=h-e),p+=e),b.css({top:o+"px",left:n+"px",width:p+"px",height:q+"px"}),l(a),!0}function k(a){return d.draggable.enabled!==t&&(d.draggable.enabled=t,c.$broadcast("gridster-draggable-changed")),A=B=0,m(a),!0}function l(a){var h=e.row,i=e.col,j=e.sizeX,k=e.sizeY,l=d.resizable&&d.resizable.resize,m=e.col;-1!==["w","nw","sw"].indexOf(g)&&(m=d.pixelsToColumns(n,!1));var r=e.row;-1!==["n","ne","nw"].indexOf(g)&&(r=d.pixelsToRows(o,!1));var s=e.sizeX;-1===["n","s"].indexOf(g)&&(s=d.pixelsToColumns(p,!0));var t=e.sizeY;-1===["e","w"].indexOf(g)&&(t=d.pixelsToRows(q,!0)),(d.pushing!==!1||0===d.getItems(r,m,s,t,e).length)&&(e.row=r,e.col=m,e.sizeX=s,e.sizeY=t);var u=e.row!==h||e.col!==i||e.sizeX!==j||e.sizeY!==k;(l||u)&&c.$apply(function(){l&&d.resizable.resize(a,b,f)})}function m(a){b.removeClass("gridster-item-moving"),b.removeClass("gridster-item-resizing"),d.movingItem=null,e.setPosition(e.row,e.col),e.setSizeY(e.sizeY),e.setSizeX(e.sizeX),c.$apply(function(){d.resizable&&d.resizable.stop&&d.resizable.stop(a,b,f)})}var n,o,p,q,r,s,t,u,v=g,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=9999,E=0,F=function(){return d.curRowHeight-d.margins[0]},G=function(){return d.curColWidth-d.margins[1]},H=null;this.enable=function(){H||(H=a.element('
    '),b.append(H)),u=new d.unifiedInput(H[0],h,j,k),u.enable()},this.disable=function(){H&&(H.remove(),H=null),u.disable(),u=void 0},this.destroy=function(){this.disable()}}var h=[],i=d.resizable.handles;"string"==typeof i&&(i=d.resizable.handles.split(","));for(var j=!1,k=0,l=i.length;l>k;k++)h.push(new g(i[k]));this.enable=function(){if(!j){for(var a=0,b=h.length;b>a;a++)h[a].enable();j=!0}},this.disable=function(){if(j){for(var a=0,b=h.length;b>a;a++)h[a].disable();j=!1}},this.toggle=function(a){a?this.enable():this.disable()},this.destroy=function(){for(var a=0,b=h.length;b>a;a++)h[a].destroy()}}return b}]).directive("gridsterItem",["$parse","GridsterDraggable","GridsterResizable",function(a,b,c){return{restrict:"EA",controller:"GridsterItemCtrl",require:["^gridster","gridsterItem"],link:function(d,e,f,g){function h(){n.setPosition(n.row,n.col),q.row&&q.row.assign&&q.row.assign(d,n.row),q.col&&q.col.assign&&q.col.assign(d,n.col)}function i(){var a=n.setSizeX(n.sizeX,!0);a&&q.sizeX&&q.sizeX.assign&&q.sizeX.assign(d,n.sizeX);var b=n.setSizeY(n.sizeY,!0);b&&q.sizeY&&q.sizeY.assign&&q.sizeY.assign(d,n.sizeY),(a||b)&&(n.gridster.moveOverlappingItems(n),m.layoutChanged())}function j(){var a=document.createElement("div"),b={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(var c in b)if(void 0!==a.style[c])return b[c]}var k,l=f.gridsterItem,m=g[0],n=g[1];if(l){var o=a(l);k=o(d)||{},!k&&o.assign&&(k={row:n.row,col:n.col,sizeX:n.sizeX,sizeY:n.sizeY,minSizeX:0,minSizeY:0,maxSizeX:null,maxSizeY:null},o.assign(d,k))}else k=f;n.init(e,m),e.addClass("gridster-item");for(var p=["minSizeX","maxSizeX","minSizeY","maxSizeY","sizeX","sizeY","row","col"],q={},r=function(b){var c;if("string"==typeof k[b])c=k[b];else if("string"==typeof k[b.toLowerCase()])c=k[b.toLowerCase()];else{if(!l)return;c=a(l+"."+b)}q[b]=a(c),d.$watch(c,function(a){a=parseInt(a,10),isNaN(a)||(n[b]=a)});var e=q[b](d);"number"==typeof e&&(n[b]=e)},s=0,t=p.length;t>s;++s)r(p[s]);d.$broadcast("gridster-item-initialized",[n.sizeY,n.sizeX,n.getElementSizeY(),n.getElementSizeX()]),d.$watch(function(){return n.row+","+n.col},h),d.$watch(function(){return n.sizeY+","+n.sizeX+"|"+n.minSizeX+","+n.maxSizeX+","+n.minSizeY+","+n.maxSizeY},i);var u=new b(e,d,m,n,k),v=new c(e,d,m,n,k);return d.$on("gridster-draggable-changed",function(){u.toggle(!m.isMobile&&m.draggable&&m.draggable.enabled)}),d.$on("gridster-resizable-changed",function(){v.toggle(!m.isMobile&&m.resizable&&m.resizable.enabled)}),d.$on("gridster-resized",function(){v.toggle(!m.isMobile&&m.resizable&&m.resizable.enabled)}),d.$watch(function(){return m.isMobile},function(){v.toggle(!m.isMobile&&m.resizable&&m.resizable.enabled),u.toggle(!m.isMobile&&m.draggable&&m.draggable.enabled)}),e.on(j(),function(){d.$apply(function(){d.$broadcast("gridster-item-transition-end")})}),d.$on("$destroy",function(){try{v.destroy(),u.destroy()}catch(a){}try{m.removeItem(n)}catch(a){}try{n.destroy()}catch(a){}})}}}])}(angular); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-hotkeys_1.4.5/hotkeys--activiti-patch.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-hotkeys_1.4.5/hotkeys--activiti-patch.js deleted file mode 100755 index fa747f0b..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-hotkeys_1.4.5/hotkeys--activiti-patch.js +++ /dev/null @@ -1,1533 +0,0 @@ -/*! - * angular-hotkeys v1.4.5 - * https://chieffancypants.github.io/angular-hotkeys - * Copyright (c) 2014 Wes Cruver - * License: MIT - */ -/* - * angular-hotkeys - * - * Automatic keyboard shortcuts for your angular apps - * - * (c) 2014 Wes Cruver - * License: MIT - */ - -(function() { - - 'use strict'; - - angular.module('cfp.hotkeys', []).provider('hotkeys', function() { - - /** - * Configurable setting to disable the cheatsheet entirely - * @type {Boolean} - */ - this.includeCheatSheet = true; - - /** - * Configurable setting for the cheat sheet title - * @type {String} - */ - - this.templateTitle = 'Keyboard Shortcuts:'; - - /** - * Cheat sheet template in the event you want to totally customize it. - * @type {String} - */ - this.template = ''; - - /** - * Configurable setting for the cheat sheet hotkey - * @type {String} - */ - this.cheatSheetHotkey = '?'; - - /** - * Configurable setting for the cheat sheet description - * @type {String} - */ - this.cheatSheetDescription = 'Show / hide this help menu'; - - this.$get = ['$rootElement', '$rootScope', '$compile', '$window', '$document', function ($rootElement, $rootScope, $compile, $window, $document) { - - // monkeypatch Mousetrap's stopCallback() function - // this version doesn't return true when the element is an INPUT, SELECT, or TEXTAREA - // (instead we will perform this check per-key in the _add() method) - Mousetrap.stopCallback = function(event, element) { - // if the element has the class "mousetrap" then no need to stop - if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { - return false; - } - - return (element.contentEditable && element.contentEditable == 'true'); - }; - - /** - * Convert strings like cmd into symbols like ⌘ - * @param {String} combo Key combination, e.g. 'mod+f' - * @return {String} The key combination with symbols - */ - function symbolize (combo) { - var map = { - command : '⌘', - shift : '⇧', - left : '←', - right : '→', - up : '↑', - down : '↓', - 'return' : '↩', - backspace : '⌫' - }; - combo = combo.split('+'); - - for (var i = 0; i < combo.length; i++) { - // try to resolve command / ctrl based on OS: - if (combo[i] === 'mod') { - if ($window.navigator && $window.navigator.platform.indexOf('Mac') >=0 ) { - combo[i] = 'command'; - } else { - combo[i] = 'ctrl'; - } - } - - combo[i] = map[combo[i]] || combo[i]; - } - - return combo.join(' + '); - } - - /** - * Hotkey object used internally for consistency - * - * @param {array} combo The keycombo. it's an array to support multiple combos - * @param {String} description Description for the keycombo - * @param {Function} callback function to execute when keycombo pressed - * @param {string} action the type of event to listen for (for mousetrap) - * @param {array} allowIn an array of tag names to allow this combo in ('INPUT', 'SELECT', and/or 'TEXTAREA') - * @param {Boolean} persistent Whether the hotkey persists navigation events - */ - function Hotkey (combo, description, callback, action, allowIn, persistent) { - // TODO: Check that the values are sane because we could - // be trying to instantiate a new Hotkey with outside dev's - // supplied values - - this.combo = combo instanceof Array ? combo : [combo]; - this.description = description; - this.callback = callback; - this.action = action; - this.allowIn = allowIn; - this.persistent = persistent; - } - - /** - * Helper method to format (symbolize) the key combo for display - * - * @return {[Array]} An array of the key combination sequence - * for example: "command+g c i" becomes ["⌘ + g", "c", "i"] - * - * TODO: this gets called a lot. We should cache the result - */ - Hotkey.prototype.format = function() { - - // Don't show all the possible key combos, just the first one. Not sure - // of usecase here, so open a ticket if my assumptions are wrong - var combo = this.combo[0]; - - var sequence = combo.split(/[\s]/); - for (var i = 0; i < sequence.length; i++) { - sequence[i] = symbolize(sequence[i]); - } - - return sequence; - }; - - /** - * A new scope used internally for the cheatsheet - * @type {$rootScope.Scope} - */ - var scope = $rootScope.$new(); - - /** - * Holds an array of Hotkey objects currently bound - * @type {Array} - */ - scope.hotkeys = []; - - /** - * Contains the state of the help's visibility - * @type {Boolean} - */ - scope.helpVisible = false; - - /** - * Holds the title string for the help menu - * @type {String} - */ - scope.title = this.templateTitle; - - /** - * Expose toggleCheatSheet to hotkeys scope so we can call it using - * ng-click from the template - * @type {function} - */ - scope.toggleCheatSheet = toggleCheatSheet; - - - /** - * Holds references to the different scopes that have bound hotkeys - * attached. This is useful to catch when the scopes are `$destroy`d and - * then automatically unbind the hotkey. - * - * @type {Array} - */ - var boundScopes = []; - - - $rootScope.$on('$routeChangeSuccess', function (event, route) { - purgeHotkeys(); - - if (route && route.hotkeys) { - angular.forEach(route.hotkeys, function (hotkey) { - // a string was given, which implies this is a function that is to be - // $eval()'d within that controller's scope - // TODO: hotkey here is super confusing. sometimes a function (that gets turned into an array), sometimes a string - var callback = hotkey[2]; - if (typeof(callback) === 'string' || callback instanceof String) { - hotkey[2] = [callback, route]; - } - - // todo: perform check to make sure not already defined: - // this came from a route, so it's likely not meant to be persistent - hotkey[5] = false; - _add.apply(this, hotkey); - }); - } - }); - - - // Auto-create a help menu: - if (this.includeCheatSheet) { - var document = $document[0]; - var element = $rootElement[0]; - var helpMenu = angular.element(this.template); - _add(this.cheatSheetHotkey, this.cheatSheetDescription, toggleCheatSheet); - - // If $rootElement is document or documentElement, then body must be used - if (element === document || element === document.documentElement) { - element = document.body; - } - - angular.element(element).append($compile(helpMenu)(scope)); - } - - - /** - * Purges all non-persistent hotkeys (such as those defined in routes) - * - * Without this, the same hotkey would get recreated everytime - * the route is accessed. - */ - function purgeHotkeys() { - var i = scope.hotkeys.length; - while (i--) { - var hotkey = scope.hotkeys[i]; - if (hotkey && !hotkey.persistent) { - _del(hotkey); - } - } - } - - /** - * Toggles the help menu element's visiblity - */ - var previousEsc = false; - - function toggleCheatSheet() { - scope.helpVisible = !scope.helpVisible; - - // Bind to esc to remove the cheat sheet. Ideally, this would be done - // as a directive in the template, but that would create a nasty - // circular dependency issue that I don't feel like sorting out. - if (scope.helpVisible) { - previousEsc = _get('esc'); - _del('esc'); - - // Here's an odd way to do this: we're going to use the original - // description of the hotkey on the cheat sheet so that it shows up. - // without it, no entry for esc will ever show up (#22) - _add('esc', previousEsc.description, toggleCheatSheet); - } else { - _del('esc'); - - // restore the previously bound ESC key - if (previousEsc !== false) { - _add(previousEsc); - } - } - } - - /** - * Creates a new Hotkey and creates the Mousetrap binding - * - * @param {string} combo mousetrap key binding - * @param {string} description description for the help menu - * @param {Function} callback method to call when key is pressed - * @param {string} action the type of event to listen for (for mousetrap) - * @param {array} allowIn an array of tag names to allow this combo in ('INPUT', 'SELECT', and/or 'TEXTAREA') - * @param {boolean} persistent if true, the binding is preserved upon route changes - */ - function _add (combo, description, callback, action, allowIn, persistent) { - - // used to save original callback for "allowIn" wrapping: - var _callback; - - // these elements are prevented by the default Mousetrap.stopCallback(): - var preventIn = ['INPUT', 'SELECT', 'TEXTAREA']; - - // Determine if object format was given: - var objType = Object.prototype.toString.call(combo); - - if (objType === '[object Object]') { - description = combo.description; - callback = combo.callback; - action = combo.action; - persistent = combo.persistent; - allowIn = combo.allowIn; - combo = combo.combo; - } - - // description is optional: - if (description instanceof Function) { - action = callback; - callback = description; - description = '$$undefined$$'; - } else if (angular.isUndefined(description)) { - description = '$$undefined$$'; - } - - // any items added through the public API are for controllers - // that persist through navigation, and thus undefined should mean - // true in this case. - if (persistent === undefined) { - persistent = true; - } - - // if callback is defined, then wrap it in a function - // that checks if the event originated from a form element. - // the function blocks the callback from executing unless the element is specified - // in allowIn (emulates Mousetrap.stopCallback() on a per-key level) - if (typeof callback === 'function') { - - // save the original callback - _callback = callback; - - // make sure allowIn is an array - if (!(allowIn instanceof Array)) { - allowIn = []; - } - - // remove anything from preventIn that's present in allowIn - var index; - for (var i=0; i < allowIn.length; i++) { - allowIn[i] = allowIn[i].toUpperCase(); - index = preventIn.indexOf(allowIn[i]); - if (index !== -1) { - preventIn.splice(index, 1); - } - } - - // create the new wrapper callback - callback = function(event) { - var shouldExecute = true; - var target = event.target || event.srcElement; // srcElement is IE only - var nodeName = target.nodeName.toUpperCase(); - - // check if the input has a mousetrap class, and skip checking preventIn if so - if ((' ' + target.className + ' ').indexOf(' mousetrap ') > -1) { - shouldExecute = true; - } else { - // don't execute callback if the event was fired from inside an element listed in preventIn - for (var i=0; i -1) { - // if the combo has other combos bound, don't unbind the whole thing, just the one combo: - if (scope.hotkeys[index].combo.length > 1) { - scope.hotkeys[index].combo.splice(scope.hotkeys[index].combo.indexOf(combo), 1); - } else { - scope.hotkeys.splice(index, 1); - } - return true; - } - } - - return false; - - } - - /** - * Get a Hotkey object by key binding - * - * @param {[string]} combo the key the Hotkey is bound to - * @return {Hotkey} The Hotkey object - */ - function _get (combo) { - - var hotkey; - - for (var i = 0; i < scope.hotkeys.length; i++) { - hotkey = scope.hotkeys[i]; - - if (hotkey.combo.indexOf(combo) > -1) { - return hotkey; - } - } - - return false; - } - - /** - * Binds the hotkey to a particular scope. Useful if the scope is - * destroyed, we can automatically destroy the hotkey binding. - * - * @param {Object} scope The scope to bind to - */ - function bindTo (scope) { - // Only initialize once to allow multiple calls for same scope. - if (!(scope.$id in boundScopes)) { - - // Add the scope to the list of bound scopes - boundScopes[scope.$id] = []; - - scope.$on('$destroy', function () { - var i = boundScopes[scope.$id].length; - while (i--) { - _del(boundScopes[scope.$id][i]); - delete boundScopes[scope.$id][i]; - } - }); - } - // return an object with an add function so we can keep track of the - // hotkeys and their scope that we added via this chaining method - return { - add: function (args) { - var hotkey; - - if (arguments.length > 1) { - hotkey = _add.apply(this, arguments); - } else { - hotkey = _add(args); - } - - boundScopes[scope.$id].push(hotkey); - return this; - } - }; - } - - /** - * All callbacks sent to Mousetrap are wrapped using this function - * so that we can force a $scope.$apply() - * - * @param {Function} callback [description] - * @return {[type]} [description] - */ - function wrapApply (callback) { - // return mousetrap a function to call - return function (event, combo) { - - // if this is an array, it means we provided a route object - // because the scope wasn't available yet, so rewrap the callback - // now that the scope is available: - if (callback instanceof Array) { - var funcString = callback[0]; - var route = callback[1]; - callback = function (event) { - route.scope.$eval(funcString); - }; - } - - // this takes place outside angular, so we'll have to call - // $apply() to make sure angular's digest happens - $rootScope.$apply(function() { - // call the original hotkey callback with the keyboard event - callback(event, _get(combo)); - }); - }; - } - - - var publicApi = { - add : _add, - del : _del, - get : _get, - bindTo : bindTo, - template : this.template, - toggleCheatSheet : toggleCheatSheet, - includeCheatSheet : this.includeCheatSheet, - cheatSheetHotkey : this.cheatSheetHotkey, - cheatSheetDescription : this.cheatSheetDescription, - purgeHotkeys : purgeHotkeys, - templateTitle : this.templateTitle - }; - - return publicApi; - - }]; - }) - - .directive('hotkey', ['hotkeys', function (hotkeys) { - return { - restrict: 'A', - link: function (scope, el, attrs) { - var key, allowIn; - - angular.forEach(scope.$eval(attrs.hotkey), function (func, hotkey) { - // split and trim the hotkeys string into array - allowIn = typeof attrs.hotkeyAllowIn === "string" ? attrs.hotkeyAllowIn.split(/[\s,]+/) : []; - - key = hotkey; - - hotkeys.add({ - combo: hotkey, - description: attrs.hotkeyDescription, - callback: func, - action: attrs.hotkeyAction, - allowIn: allowIn - }); - }); - - // remove the hotkey if the directive is destroyed: - el.bind('$destroy', function() { - hotkeys.del(key); - }); - } - }; - }]) - - .run(['hotkeys', function(hotkeys) { - // force hotkeys to run by injecting it. Without this, hotkeys only runs - // when a controller or something else asks for it via DI. - }]); - -})(); - -/*global define:false */ -/** - * Copyright 2013 Craig Campbell - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Mousetrap is a simple keyboard shortcut library for Javascript with - * no external dependencies - * - * @version 1.4.6 - * @url craig.is/killing/mice - */ -(function(window, document, undefined) { - - /** - * mapping of special keycodes to their corresponding keys - * - * everything in this dictionary cannot use keypress events - * so it has to be here to map to the correct keycodes for - * keyup/keydown events - * - * @type {Object} - */ - var _MAP = { - 8: 'backspace', - 9: 'tab', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 20: 'capslock', - 27: 'esc', - 32: 'space', - 33: 'pageup', - 34: 'pagedown', - 35: 'end', - 36: 'home', - 37: 'left', - 38: 'up', - 39: 'right', - 40: 'down', - 45: 'ins', - 46: 'del', - 91: 'meta', - 93: 'meta', - 224: 'meta' - }, - - /** - * mapping for special characters so they can support - * - * this dictionary is only used incase you want to bind a - * keyup or keydown event to one of these keys - * - * @type {Object} - */ - _KEYCODE_MAP = { - 106: '*', - 107: '+', - 109: '-', - 110: '.', - 111 : '/', - 186: ';', - 187: '=', - 188: ',', - 189: '-', - 190: '.', - 191: '/', - 192: '`', - 219: '[', - 220: '\\', - 221: ']', - 222: '\'' - }, - - /** - * this is a mapping of keys that require shift on a US keypad - * back to the non shift equivelents - * - * this is so you can use keyup events with these keys - * - * note that this will only work reliably on US keyboards - * - * @type {Object} - */ - _SHIFT_MAP = { - '~': '`', - '!': '1', - '@': '2', - '#': '3', - '$': '4', - '%': '5', - '^': '6', - '&': '7', - '*': '8', - '(': '9', - ')': '0', - '_': '-', - '+': '=', - ':': ';', - '\"': '\'', - '<': ',', - '>': '.', - '?': '/', - '|': '\\' - }, - - /** - * this is a list of special strings you can use to map - * to modifier keys when you specify your keyboard shortcuts - * - * @type {Object} - */ - _SPECIAL_ALIASES = { - 'option': 'alt', - 'command': 'meta', - 'return': 'enter', - 'escape': 'esc', - 'mod': /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl' - }, - - /** - * variable to store the flipped version of _MAP from above - * needed to check if we should use keypress or not when no action - * is specified - * - * @type {Object|undefined} - */ - _REVERSE_MAP, - - /** - * a list of all the callbacks setup via Mousetrap.bind() - * - * @type {Object} - */ - _callbacks = {}, - - /** - * direct map of string combinations to callbacks used for trigger() - * - * @type {Object} - */ - _directMap = {}, - - /** - * keeps track of what level each sequence is at since multiple - * sequences can start out with the same sequence - * - * @type {Object} - */ - _sequenceLevels = {}, - - /** - * variable to store the setTimeout call - * - * @type {null|number} - */ - _resetTimer, - - /** - * temporary state where we will ignore the next keyup - * - * @type {boolean|string} - */ - _ignoreNextKeyup = false, - - /** - * temporary state where we will ignore the next keypress - * - * @type {boolean} - */ - _ignoreNextKeypress = false, - - /** - * are we currently inside of a sequence? - * type of action ("keyup" or "keydown" or "keypress") or false - * - * @type {boolean|string} - */ - _nextExpectedAction = false; - - /** - * loop through the f keys, f1 to f19 and add them to the map - * programatically - */ - for (var i = 1; i < 20; ++i) { - _MAP[111 + i] = 'f' + i; - } - - /** - * loop through to map numbers on the numeric keypad - */ - for (i = 0; i <= 9; ++i) { - _MAP[i + 96] = i; - } - - /** - * cross browser add event method - * - * @param {Element|HTMLDocument} object - * @param {string} type - * @param {Function} callback - * @returns void - */ - function _addEvent(object, type, callback) { - if (object.addEventListener) { - object.addEventListener(type, callback, false); - return; - } - - object.attachEvent('on' + type, callback); - } - - /** - * takes the event and returns the key character - * - * @param {Event} e - * @return {string} - */ - function _characterFromEvent(e) { - - // for keypress events we should return the character as is - if (e.type == 'keypress') { - var character = String.fromCharCode(e.which); - - // if the shift key is not pressed then it is safe to assume - // that we want the character to be lowercase. this means if - // you accidentally have caps lock on then your key bindings - // will continue to work - // - // the only side effect that might not be desired is if you - // bind something like 'A' cause you want to trigger an - // event when capital A is pressed caps lock will no longer - // trigger the event. shift+a will though. - if (!e.shiftKey) { - character = character.toLowerCase(); - } - - return character; - } - - // for non keypress events the special maps are needed - if (_MAP[e.which]) { - return _MAP[e.which]; - } - - if (_KEYCODE_MAP[e.which]) { - return _KEYCODE_MAP[e.which]; - } - - // if it is not in the special map - - // with keydown and keyup events the character seems to always - // come in as an uppercase character whether you are pressing shift - // or not. we should make sure it is always lowercase for comparisons - return String.fromCharCode(e.which).toLowerCase(); - } - - /** - * checks if two arrays are equal - * - * @param {Array} modifiers1 - * @param {Array} modifiers2 - * @returns {boolean} - */ - function _modifiersMatch(modifiers1, modifiers2) { - return modifiers1.sort().join(',') === modifiers2.sort().join(','); - } - - /** - * resets all sequence counters except for the ones passed in - * - * @param {Object} doNotReset - * @returns void - */ - function _resetSequences(doNotReset) { - doNotReset = doNotReset || {}; - - var activeSequences = false, - key; - - for (key in _sequenceLevels) { - if (doNotReset[key]) { - activeSequences = true; - continue; - } - _sequenceLevels[key] = 0; - } - - if (!activeSequences) { - _nextExpectedAction = false; - } - } - - /** - * finds all callbacks that match based on the keycode, modifiers, - * and action - * - * @param {string} character - * @param {Array} modifiers - * @param {Event|Object} e - * @param {string=} sequenceName - name of the sequence we are looking for - * @param {string=} combination - * @param {number=} level - * @returns {Array} - */ - function _getMatches(character, modifiers, e, sequenceName, combination, level) { - var i, - callback, - matches = [], - action = e.type; - - // if there are no events related to this keycode - if (!_callbacks[character]) { - return []; - } - - // if a modifier key is coming up on its own we should allow it - if (action == 'keyup' && _isModifier(character)) { - modifiers = [character]; - } - - // loop through all callbacks for the key that was pressed - // and see if any of them match - for (i = 0; i < _callbacks[character].length; ++i) { - callback = _callbacks[character][i]; - - // if a sequence name is not specified, but this is a sequence at - // the wrong level then move onto the next match - if (!sequenceName && callback.seq && _sequenceLevels[callback.seq] != callback.level) { - continue; - } - - // if the action we are looking for doesn't match the action we got - // then we should keep going - if (action != callback.action) { - continue; - } - - // if this is a keypress event and the meta key and control key - // are not pressed that means that we need to only look at the - // character, otherwise check the modifiers as well - // - // chrome will not fire a keypress if meta or control is down - // safari will fire a keypress if meta or meta+shift is down - // firefox will fire a keypress if meta or control is down - if ((action == 'keypress' && !e.metaKey && !e.ctrlKey) || _modifiersMatch(modifiers, callback.modifiers)) { - - // when you bind a combination or sequence a second time it - // should overwrite the first one. if a sequenceName or - // combination is specified in this call it does just that - // - // @todo make deleting its own method? - var deleteCombo = !sequenceName && callback.combo == combination; - var deleteSequence = sequenceName && callback.seq == sequenceName && callback.level == level; - if (deleteCombo || deleteSequence) { - _callbacks[character].splice(i, 1); - } - - matches.push(callback); - } - } - - return matches; - } - - /** - * takes a key event and figures out what the modifiers are - * - * @param {Event} e - * @returns {Array} - */ - function _eventModifiers(e) { - var modifiers = []; - - if (e.shiftKey) { - modifiers.push('shift'); - } - - if (e.altKey) { - modifiers.push('alt'); - } - - if (e.ctrlKey) { - modifiers.push('ctrl'); - } - - if (e.metaKey) { - modifiers.push('meta'); - } - - return modifiers; - } - - /** - * prevents default for this event - * - * @param {Event} e - * @returns void - */ - function _preventDefault(e) { - if (e.preventDefault) { - e.preventDefault(); - return; - } - - e.returnValue = false; - } - - /** - * stops propogation for this event - * - * @param {Event} e - * @returns void - */ - function _stopPropagation(e) { - if (e.stopPropagation) { - e.stopPropagation(); - return; - } - - e.cancelBubble = true; - } - - /** - * actually calls the callback function - * - * if your callback function returns false this will use the jquery - * convention - prevent default and stop propogation on the event - * - * @param {Function} callback - * @param {Event} e - * @returns void - */ - function _fireCallback(callback, e, combo, sequence) { - - // if this event should not happen stop here - if (Mousetrap.stopCallback(e, e.target || e.srcElement, combo, sequence)) { - return; - } - - if (callback(e, combo) === false) { - _preventDefault(e); - _stopPropagation(e); - } - } - - /** - * handles a character key event - * - * @param {string} character - * @param {Array} modifiers - * @param {Event} e - * @returns void - */ - function _handleKey(character, modifiers, e) { - var callbacks = _getMatches(character, modifiers, e), - i, - doNotReset = {}, - maxLevel = 0, - processedSequenceCallback = false; - - // Calculate the maxLevel for sequences so we can only execute the longest callback sequence - for (i = 0; i < callbacks.length; ++i) { - if (callbacks[i].seq) { - maxLevel = Math.max(maxLevel, callbacks[i].level); - } - } - - // loop through matching callbacks for this key event - for (i = 0; i < callbacks.length; ++i) { - - // fire for all sequence callbacks - // this is because if for example you have multiple sequences - // bound such as "g i" and "g t" they both need to fire the - // callback for matching g cause otherwise you can only ever - // match the first one - if (callbacks[i].seq) { - - // only fire callbacks for the maxLevel to prevent - // subsequences from also firing - // - // for example 'a option b' should not cause 'option b' to fire - // even though 'option b' is part of the other sequence - // - // any sequences that do not match here will be discarded - // below by the _resetSequences call - if (callbacks[i].level != maxLevel) { - continue; - } - - processedSequenceCallback = true; - - // keep a list of which sequences were matches for later - doNotReset[callbacks[i].seq] = 1; - _fireCallback(callbacks[i].callback, e, callbacks[i].combo, callbacks[i].seq); - continue; - } - - // if there were no sequence matches but we are still here - // that means this is a regular match so we should fire that - if (!processedSequenceCallback) { - _fireCallback(callbacks[i].callback, e, callbacks[i].combo); - } - } - - // if the key you pressed matches the type of sequence without - // being a modifier (ie "keyup" or "keypress") then we should - // reset all sequences that were not matched by this event - // - // this is so, for example, if you have the sequence "h a t" and you - // type "h e a r t" it does not match. in this case the "e" will - // cause the sequence to reset - // - // modifier keys are ignored because you can have a sequence - // that contains modifiers such as "enter ctrl+space" and in most - // cases the modifier key will be pressed before the next key - // - // also if you have a sequence such as "ctrl+b a" then pressing the - // "b" key will trigger a "keypress" and a "keydown" - // - // the "keydown" is expected when there is a modifier, but the - // "keypress" ends up matching the _nextExpectedAction since it occurs - // after and that causes the sequence to reset - // - // we ignore keypresses in a sequence that directly follow a keydown - // for the same character - var ignoreThisKeypress = e.type == 'keypress' && _ignoreNextKeypress; - if (e.type == _nextExpectedAction && !_isModifier(character) && !ignoreThisKeypress) { - _resetSequences(doNotReset); - } - - _ignoreNextKeypress = processedSequenceCallback && e.type == 'keydown'; - } - - /** - * handles a keydown event - * - * @param {Event} e - * @returns void - */ - function _handleKeyEvent(e) { - - // normalize e.which for key events - // @see http://stackoverflow.com/questions/4285627/javascript-keycode-vs-charcode-utter-confusion - if (typeof e.which !== 'number') { - e.which = e.keyCode; - } - - var character = _characterFromEvent(e); - - // no character found then stop - if (!character) { - return; - } - - // need to use === for the character check because the character can be 0 - if (e.type == 'keyup' && _ignoreNextKeyup === character) { - _ignoreNextKeyup = false; - return; - } - - Mousetrap.handleKey(character, _eventModifiers(e), e); - } - - /** - * determines if the keycode specified is a modifier key or not - * - * @param {string} key - * @returns {boolean} - */ - function _isModifier(key) { - return key == 'shift' || key == 'ctrl' || key == 'alt' || key == 'meta'; - } - - /** - * called to set a 1 second timeout on the specified sequence - * - * this is so after each key press in the sequence you have 1 second - * to press the next key before you have to start over - * - * @returns void - */ - function _resetSequenceTimer() { - clearTimeout(_resetTimer); - _resetTimer = setTimeout(_resetSequences, 1000); - } - - /** - * reverses the map lookup so that we can look for specific keys - * to see what can and can't use keypress - * - * @return {Object} - */ - function _getReverseMap() { - if (!_REVERSE_MAP) { - _REVERSE_MAP = {}; - for (var key in _MAP) { - - // pull out the numeric keypad from here cause keypress should - // be able to detect the keys from the character - if (key > 95 && key < 112) { - continue; - } - - if (_MAP.hasOwnProperty(key)) { - _REVERSE_MAP[_MAP[key]] = key; - } - } - } - return _REVERSE_MAP; - } - - /** - * picks the best action based on the key combination - * - * @param {string} key - character for key - * @param {Array} modifiers - * @param {string=} action passed in - */ - function _pickBestAction(key, modifiers, action) { - - // if no action was picked in we should try to pick the one - // that we think would work best for this key - if (!action) { - action = _getReverseMap()[key] ? 'keydown' : 'keypress'; - } - - // modifier keys don't work as expected with keypress, - // switch to keydown - if (action == 'keypress' && modifiers.length) { - action = 'keydown'; - } - - return action; - } - - /** - * binds a key sequence to an event - * - * @param {string} combo - combo specified in bind call - * @param {Array} keys - * @param {Function} callback - * @param {string=} action - * @returns void - */ - function _bindSequence(combo, keys, callback, action) { - - // start off by adding a sequence level record for this combination - // and setting the level to 0 - _sequenceLevels[combo] = 0; - - /** - * callback to increase the sequence level for this sequence and reset - * all other sequences that were active - * - * @param {string} nextAction - * @returns {Function} - */ - function _increaseSequence(nextAction) { - return function() { - _nextExpectedAction = nextAction; - ++_sequenceLevels[combo]; - _resetSequenceTimer(); - }; - } - - /** - * wraps the specified callback inside of another function in order - * to reset all sequence counters as soon as this sequence is done - * - * @param {Event} e - * @returns void - */ - function _callbackAndReset(e) { - _fireCallback(callback, e, combo); - - // we should ignore the next key up if the action is key down - // or keypress. this is so if you finish a sequence and - // release the key the final key will not trigger a keyup - if (action !== 'keyup') { - _ignoreNextKeyup = _characterFromEvent(e); - } - - // weird race condition if a sequence ends with the key - // another sequence begins with - setTimeout(_resetSequences, 10); - } - - // loop through keys one at a time and bind the appropriate callback - // function. for any key leading up to the final one it should - // increase the sequence. after the final, it should reset all sequences - // - // if an action is specified in the original bind call then that will - // be used throughout. otherwise we will pass the action that the - // next key in the sequence should match. this allows a sequence - // to mix and match keypress and keydown events depending on which - // ones are better suited to the key provided - for (var i = 0; i < keys.length; ++i) { - var isFinal = i + 1 === keys.length; - var wrappedCallback = isFinal ? _callbackAndReset : _increaseSequence(action || _getKeyInfo(keys[i + 1]).action); - _bindSingle(keys[i], wrappedCallback, action, combo, i); - } - } - - /** - * Converts from a string key combination to an array - * - * @param {string} combination like "command+shift+l" - * @return {Array} - */ - function _keysFromString(combination) { - if (combination === '+') { - return ['+']; - } - - return combination.split('+'); - } - - /** - * Gets info for a specific key combination - * - * @param {string} combination key combination ("command+s" or "a" or "*") - * @param {string=} action - * @returns {Object} - */ - function _getKeyInfo(combination, action) { - var keys, - key, - i, - modifiers = []; - - // take the keys from this pattern and figure out what the actual - // pattern is all about - keys = _keysFromString(combination); - - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - - // normalize key names - if (_SPECIAL_ALIASES[key]) { - key = _SPECIAL_ALIASES[key]; - } - - // if this is not a keypress event then we should - // be smart about using shift keys - // this will only work for US keyboards however - if (action && action != 'keypress' && _SHIFT_MAP[key]) { - key = _SHIFT_MAP[key]; - modifiers.push('shift'); - } - - // if this key is a modifier then add it to the list of modifiers - if (_isModifier(key)) { - modifiers.push(key); - } - } - - // depending on what the key combination is - // we will try to pick the best event for it - action = _pickBestAction(key, modifiers, action); - - return { - key: key, - modifiers: modifiers, - action: action - }; - } - - /** - * binds a single keyboard combination - * - * @param {string} combination - * @param {Function} callback - * @param {string=} action - * @param {string=} sequenceName - name of sequence if part of sequence - * @param {number=} level - what part of the sequence the command is - * @returns void - */ - function _bindSingle(combination, callback, action, sequenceName, level) { - - // store a direct mapped reference for use with Mousetrap.trigger - _directMap[combination + ':' + action] = callback; - - // make sure multiple spaces in a row become a single space - combination = combination.replace(/\s+/g, ' '); - - var sequence = combination.split(' '), - info; - - // if this pattern is a sequence of keys then run through this method - // to reprocess each pattern one key at a time - if (sequence.length > 1) { - _bindSequence(combination, sequence, callback, action); - return; - } - - info = _getKeyInfo(combination, action); - - // make sure to initialize array if this is the first time - // a callback is added for this key - _callbacks[info.key] = _callbacks[info.key] || []; - - // remove an existing match if there is one - _getMatches(info.key, info.modifiers, {type: info.action}, sequenceName, combination, level); - - // add this call back to the array - // if it is a sequence put it at the beginning - // if not put it at the end - // - // this is important because the way these are processed expects - // the sequence ones to come first - _callbacks[info.key][sequenceName ? 'unshift' : 'push']({ - callback: callback, - modifiers: info.modifiers, - action: info.action, - seq: sequenceName, - level: level, - combo: combination - }); - } - - /** - * binds multiple combinations to the same callback - * - * @param {Array} combinations - * @param {Function} callback - * @param {string|undefined} action - * @returns void - */ - function _bindMultiple(combinations, callback, action) { - for (var i = 0; i < combinations.length; ++i) { - _bindSingle(combinations[i], callback, action); - } - } - - // start! - _addEvent(document, 'keypress', _handleKeyEvent); - _addEvent(document, 'keydown', _handleKeyEvent); - _addEvent(document, 'keyup', _handleKeyEvent); - - var Mousetrap = { - - /** - * binds an event to mousetrap - * - * can be a single key, a combination of keys separated with +, - * an array of keys, or a sequence of keys separated by spaces - * - * be sure to list the modifier keys first to make sure that the - * correct key ends up getting bound (the last key in the pattern) - * - * @param {string|Array} keys - * @param {Function} callback - * @param {string=} action - 'keypress', 'keydown', or 'keyup' - * @returns void - */ - bind: function(keys, callback, action) { - keys = keys instanceof Array ? keys : [keys]; - _bindMultiple(keys, callback, action); - return this; - }, - - /** - * unbinds an event to mousetrap - * - * the unbinding sets the callback function of the specified key combo - * to an empty function and deletes the corresponding key in the - * _directMap dict. - * - * TODO: actually remove this from the _callbacks dictionary instead - * of binding an empty function - * - * the keycombo+action has to be exactly the same as - * it was defined in the bind method - * - * @param {string|Array} keys - * @param {string} action - * @returns void - */ - unbind: function(keys, action) { - return Mousetrap.bind(keys, function() {}, action); - }, - - /** - * triggers an event that has already been bound - * - * @param {string} keys - * @param {string=} action - * @returns void - */ - trigger: function(keys, action) { - if (_directMap[keys + ':' + action]) { - _directMap[keys + ':' + action]({}, keys); - } - return this; - }, - - /** - * resets the library back to its initial state. this is useful - * if you want to clear out the current keyboard shortcuts and bind - * new ones - for example if you switch to another page - * - * @returns void - */ - reset: function() { - _callbacks = {}; - _directMap = {}; - return this; - }, - - /** - * should we stop this event before firing off callbacks - * - * @param {Event} e - * @param {Element} element - * @return {boolean} - */ - stopCallback: function(e, element) { - - // if the element has the class "mousetrap" then no need to stop - if ((' ' + element.className + ' ').indexOf(' mousetrap ') > -1) { - return false; - } - - // stop for input, select, and textarea - return element.tagName == 'INPUT' || element.tagName == 'SELECT' || element.tagName == 'TEXTAREA' || element.isContentEditable; - }, - - /** - * exposes _handleKey publicly so it can be overwritten by extensions - */ - handleKey: _handleKey - }; - - // expose mousetrap to the global object - window.Mousetrap = Mousetrap; - - /* - - Can't let hotkeys define itself as a module since it will cause Flowable to not work in Alfresco Share: - In Share this file is being loaded from a -
    - Snippet: - - - - - - - - - - - - - - - - - - - - - - - - - -
    DirectiveHowSourceRendered
    ng-bind-htmlAutomatically uses $sanitize
    <div ng-bind-html="snippet">
    </div>
    ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value -
    <div ng-bind-html="deliberatelyTrustDangerousSnippet()">
    -</div>
    -
    ng-bindAutomatically escapes
    <div ng-bind="snippet">
    </div>
    -
    - - - it('should sanitize the html snippet by default', function() { - expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). - toBe('

    an html\nclick here\nsnippet

    '); - }); - - it('should inline raw snippet if bound to a trusted value', function() { - expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). - toBe("

    an html\n" + - "click here\n" + - "snippet

    "); - }); - - it('should escape snippet without any filter', function() { - expect(element(by.css('#bind-default div')).getInnerHtml()). - toBe("<p style=\"color:blue\">an html\n" + - "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + - "snippet</p>"); - }); - - it('should update', function() { - element(by.model('snippet')).clear(); - element(by.model('snippet')).sendKeys('new text'); - expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). - toBe('new text'); - expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( - 'new text'); - expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( - "new <b onclick=\"alert(1)\">text</b>"); - }); -
    - - */ -function $SanitizeProvider() { - this.$get = ['$$sanitizeUri', function($$sanitizeUri) { - return function(html) { - var buf = []; - htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { - return !/^unsafe/.test($$sanitizeUri(uri, isImage)); - })); - return buf.join(''); - }; - }]; -} - -function sanitizeText(chars) { - var buf = []; - var writer = htmlSanitizeWriter(buf, angular.noop); - writer.chars(chars); - return buf.join(''); -} - - -// Regular Expressions for parsing tags and attributes -var START_TAG_REGEXP = - /^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/, - END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/, - ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, - BEGIN_TAG_REGEXP = /^/g, - DOCTYPE_REGEXP = /]*?)>/i, - CDATA_REGEXP = //g, - SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, - // Match everything outside of normal chars and " (quote character) - NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; - - -// Good source of info about elements and attributes -// http://dev.w3.org/html5/spec/Overview.html#semantics -// http://simon.html5.org/html-elements - -// Safe Void Elements - HTML5 -// http://dev.w3.org/html5/spec/Overview.html#void-elements -var voidElements = makeMap("area,br,col,hr,img,wbr"); - -// Elements that you can, intentionally, leave open (and which close themselves) -// http://dev.w3.org/html5/spec/Overview.html#optional-tags -var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), - optionalEndTagInlineElements = makeMap("rp,rt"), - optionalEndTagElements = angular.extend({}, - optionalEndTagInlineElements, - optionalEndTagBlockElements); - -// Safe Block Elements - HTML5 -var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," + - "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + - "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); - -// Inline Elements - HTML5 -var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," + - "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + - "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); - -// SVG Elements -// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements -var svgElements = makeMap("animate,animateColor,animateMotion,animateTransform,circle,defs," + - "desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient," + - "line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,set," + - "stop,svg,switch,text,title,tspan,use"); - -// Special Elements (can contain anything) -var specialElements = makeMap("script,style"); - -var validElements = angular.extend({}, - voidElements, - blockElements, - inlineElements, - optionalEndTagElements, - svgElements); - -//Attributes that have href and hence need to be sanitized -var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href"); - -var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + - 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + - 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + - 'scope,scrolling,shape,size,span,start,summary,target,title,type,' + - 'valign,value,vspace,width'); - -// SVG attributes (without "id" and "name" attributes) -// https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes -var svgAttrs = makeMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' + - 'attributeName,attributeType,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,' + - 'color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,' + - 'font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,' + - 'gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,' + - 'keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,' + - 'markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,' + - 'overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,' + - 'repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,' + - 'stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,' + - 'stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,' + - 'stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,' + - 'underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,' + - 'viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,' + - 'xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,' + - 'zoomAndPan'); - -var validAttrs = angular.extend({}, - uriAttrs, - svgAttrs, - htmlAttrs); - -function makeMap(str) { - var obj = {}, items = str.split(','), i; - for (i = 0; i < items.length; i++) obj[items[i]] = true; - return obj; -} - - -/** - * @example - * htmlParser(htmlString, { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * }); - * - * @param {string} html string - * @param {object} handler - */ -function htmlParser(html, handler) { - if (typeof html !== 'string') { - if (html === null || typeof html === 'undefined') { - html = ''; - } else { - html = '' + html; - } - } - var index, chars, match, stack = [], last = html, text; - stack.last = function() { return stack[stack.length - 1]; }; - - while (html) { - text = ''; - chars = true; - - // Make sure we're not in a script or style element - if (!stack.last() || !specialElements[stack.last()]) { - - // Comment - if (html.indexOf("", index) === index) { - if (handler.comment) handler.comment(html.substring(4, index)); - html = html.substring(index + 3); - chars = false; - } - // DOCTYPE - } else if (DOCTYPE_REGEXP.test(html)) { - match = html.match(DOCTYPE_REGEXP); - - if (match) { - html = html.replace(match[0], ''); - chars = false; - } - // end tag - } else if (BEGING_END_TAGE_REGEXP.test(html)) { - match = html.match(END_TAG_REGEXP); - - if (match) { - html = html.substring(match[0].length); - match[0].replace(END_TAG_REGEXP, parseEndTag); - chars = false; - } - - // start tag - } else if (BEGIN_TAG_REGEXP.test(html)) { - match = html.match(START_TAG_REGEXP); - - if (match) { - // We only have a valid start-tag if there is a '>'. - if (match[4]) { - html = html.substring(match[0].length); - match[0].replace(START_TAG_REGEXP, parseStartTag); - } - chars = false; - } else { - // no ending tag found --- this piece should be encoded as an entity. - text += '<'; - html = html.substring(1); - } - } - - if (chars) { - index = html.indexOf("<"); - - text += index < 0 ? html : html.substring(0, index); - html = index < 0 ? "" : html.substring(index); - - if (handler.chars) handler.chars(decodeEntities(text)); - } - - } else { - // IE versions 9 and 10 do not understand the regex '[^]', so using a workaround with [\W\w]. - html = html.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), - function(all, text) { - text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); - - if (handler.chars) handler.chars(decodeEntities(text)); - - return ""; - }); - - parseEndTag("", stack.last()); - } - - if (html == last) { - throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + - "of html: {0}", html); - } - last = html; - } - - // Clean up any remaining tags - parseEndTag(); - - function parseStartTag(tag, tagName, rest, unary) { - tagName = angular.lowercase(tagName); - if (blockElements[tagName]) { - while (stack.last() && inlineElements[stack.last()]) { - parseEndTag("", stack.last()); - } - } - - if (optionalEndTagElements[tagName] && stack.last() == tagName) { - parseEndTag("", tagName); - } - - unary = voidElements[tagName] || !!unary; - - if (!unary) - stack.push(tagName); - - var attrs = {}; - - rest.replace(ATTR_REGEXP, - function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { - var value = doubleQuotedValue - || singleQuotedValue - || unquotedValue - || ''; - - attrs[name] = decodeEntities(value); - }); - if (handler.start) handler.start(tagName, attrs, unary); - } - - function parseEndTag(tag, tagName) { - var pos = 0, i; - tagName = angular.lowercase(tagName); - if (tagName) - // Find the closest opened tag of the same type - for (pos = stack.length - 1; pos >= 0; pos--) - if (stack[pos] == tagName) - break; - - if (pos >= 0) { - // Close all the open elements, up the stack - for (i = stack.length - 1; i >= pos; i--) - if (handler.end) handler.end(stack[i]); - - // Remove the open elements from the stack - stack.length = pos; - } - } -} - -var hiddenPre=document.createElement("pre"); -var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/; -/** - * decodes all entities into regular string - * @param value - * @returns {string} A string with decoded entities. - */ -function decodeEntities(value) { - if (!value) { return ''; } - - // Note: IE8 does not preserve spaces at the start/end of innerHTML - // so we must capture them and reattach them afterward - var parts = spaceRe.exec(value); - var spaceBefore = parts[1]; - var spaceAfter = parts[3]; - var content = parts[2]; - if (content) { - hiddenPre.innerHTML=content.replace(//g, '>'); -} - -/** - * create an HTML/XML writer which writes to buffer - * @param {Array} buf use buf.jain('') to get out sanitized html string - * @returns {object} in the form of { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * } - */ -function htmlSanitizeWriter(buf, uriValidator) { - var ignore = false; - var out = angular.bind(buf, buf.push); - return { - start: function(tag, attrs, unary) { - tag = angular.lowercase(tag); - if (!ignore && specialElements[tag]) { - ignore = tag; - } - if (!ignore && validElements[tag] === true) { - out('<'); - out(tag); - angular.forEach(attrs, function(value, key) { - var lkey=angular.lowercase(key); - var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); - if (validAttrs[lkey] === true && - (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { - out(' '); - out(key); - out('="'); - out(encodeEntities(value)); - out('"'); - } - }); - out(unary ? '/>' : '>'); - } - }, - end: function(tag) { - tag = angular.lowercase(tag); - if (!ignore && validElements[tag] === true) { - out(''); - } - if (tag == ignore) { - ignore = false; - } - }, - chars: function(chars) { - if (!ignore) { - out(encodeEntities(chars)); - } - } - }; -} - - -// define ngSanitize module and register $sanitize service -angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); - -/* global sanitizeText: false */ - -/** - * @ngdoc filter - * @name linky - * @kind function - * - * @description - * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and - * plain email address links. - * - * Requires the {@link ngSanitize `ngSanitize`} module to be installed. - * - * @param {string} text Input text. - * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. - * @returns {string} Html-linkified text. - * - * @usage - - * - * @example - - - -
    - Snippet: - - - - - - - - - - - - - - - - - - - - - -
    FilterSourceRendered
    linky filter -
    <div ng-bind-html="snippet | linky">
    </div>
    -
    -
    -
    linky target -
    <div ng-bind-html="snippetWithTarget | linky:'_blank'">
    </div>
    -
    -
    -
    no filter
    <div ng-bind="snippet">
    </div>
    - - - it('should linkify the snippet with urls', function() { - expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). - toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + - 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); - expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); - }); - - it('should not linkify snippet without the linky filter', function() { - expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). - toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + - 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); - expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); - }); - - it('should update', function() { - element(by.model('snippet')).clear(); - element(by.model('snippet')).sendKeys('new http://link.'); - expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). - toBe('new http://link.'); - expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); - expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) - .toBe('new http://link.'); - }); - - it('should work with the target property', function() { - expect(element(by.id('linky-target')). - element(by.binding("snippetWithTarget | linky:'_blank'")).getText()). - toBe('http://angularjs.org/'); - expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); - }); - - - */ -angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { - var LINKY_URL_REGEXP = - /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/, - MAILTO_REGEXP = /^mailto:/; - - return function(text, target) { - if (!text) return text; - var match; - var raw = text; - var html = []; - var url; - var i; - while ((match = raw.match(LINKY_URL_REGEXP))) { - // We can not end in these as they are sometimes found at the end of the sentence - url = match[0]; - // if we did not match ftp/http/www/mailto then assume mailto - if (!match[2] && !match[4]) { - url = (match[3] ? 'http://' : 'mailto:') + url; - } - i = match.index; - addText(raw.substr(0, i)); - addLink(url, match[0].replace(MAILTO_REGEXP, '')); - raw = raw.substring(i + match[0].length); - } - addText(raw); - return $sanitize(html.join('')); - - function addText(text) { - if (!text) { - return; - } - html.push(sanitizeText(text)); - } - - function addLink(url, text) { - html.push(''); - addText(text); - html.push(''); - } - }; -}]); - - -})(window, window.angular); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-sanitize_1.3.13/angular-sanitize.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-sanitize_1.3.13/angular-sanitize.min.js deleted file mode 100644 index e6c2b1e6..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-sanitize_1.3.13/angular-sanitize.min.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - AngularJS v1.3.13 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(n,h,p){'use strict';function E(a){var d=[];s(d,h.noop).chars(a);return d.join("")}function g(a){var d={};a=a.split(",");var c;for(c=0;c=c;e--)d.end&&d.end(f[e]);f.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,f=[],m=a,l;for(f.last=function(){return f[f.length-1]};a;){l="";k=!0;if(f.last()&&x[f.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");d.chars&&d.chars(r(b));return""}),e("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(d.comment&& -d.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(y.test(a)){if(b=a.match(y))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(z))a=a.substring(b[0].length),b[0].replace(z,e),k=!1}else K.test(a)&&((b=a.match(A))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(A,c)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),d.chars&&d.chars(r(l)))}if(a==m)throw L("badparse",a);m=a}e()}function r(a){if(!a)return"";var d=M.exec(a);a=d[1]; -var c=d[3];if(d=d[2])q.innerHTML=d.replace(//g,">")}function s(a,d){var c=!1,e=h.bind(a,a.push);return{start:function(a,k,f){a=h.lowercase(a);!c&&x[a]&&(c=a);c||!0!==C[a]||(e("<"),e(a), -h.forEach(k,function(c,f){var k=h.lowercase(f),g="img"===a&&"src"===k||"background"===k;!0!==P[k]||!0===D[k]&&!d(c,g)||(e(" "),e(f),e('="'),e(B(c)),e('"'))}),e(f?"/>":">"))},end:function(a){a=h.lowercase(a);c||!0!==C[a]||(e(""));a==c&&(c=!1)},chars:function(a){c||e(B(a))}}}var L=h.$$minErr("$sanitize"),A=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,z=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, -K=/^]*?)>/i,I=/"\u201d\u2019]/,c=/^mailto:/;return function(e,b){function k(a){a&&g.push(E(a))} -function f(a,c){g.push("');k(c);g.push("")}if(!e)return e;for(var m,l=e,g=[],n,p;m=l.match(d);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),f(n,m[0].replace(c,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); -//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-sanitize_1.3.13/angular-sanitize.min.js.map b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-sanitize_1.3.13/angular-sanitize.min.js.map deleted file mode 100644 index 66bf00a1..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-sanitize_1.3.13/angular-sanitize.min.js.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"angular-sanitize.min.js", -"lineCount":15, -"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAkJtCC,QAASA,EAAY,CAACC,CAAD,CAAQ,CAC3B,IAAIC,EAAM,EACGC,EAAAC,CAAmBF,CAAnBE,CAAwBN,CAAAO,KAAxBD,CACbH,MAAA,CAAaA,CAAb,CACA,OAAOC,EAAAI,KAAA,CAAS,EAAT,CAJoB,CAmG7BC,QAASA,EAAO,CAACC,CAAD,CAAM,CAAA,IAChBC,EAAM,EAAIC,EAAAA,CAAQF,CAAAG,MAAA,CAAU,GAAV,CAAtB,KAAsCC,CACtC,KAAKA,CAAL,CAAS,CAAT,CAAYA,CAAZ,CAAgBF,CAAAG,OAAhB,CAA8BD,CAAA,EAA9B,CAAmCH,CAAA,CAAIC,CAAA,CAAME,CAAN,CAAJ,CAAA,CAAgB,CAAA,CACnD,OAAOH,EAHa,CAmBtBK,QAASA,EAAU,CAACC,CAAD,CAAOC,CAAP,CAAgB,CAiGjCC,QAASA,EAAa,CAACC,CAAD,CAAMC,CAAN,CAAeC,CAAf,CAAqBC,CAArB,CAA4B,CAChDF,CAAA,CAAUrB,CAAAwB,UAAA,CAAkBH,CAAlB,CACV,IAAII,CAAA,CAAcJ,CAAd,CAAJ,CACE,IAAA,CAAOK,CAAAC,KAAA,EAAP,EAAuBC,CAAA,CAAeF,CAAAC,KAAA,EAAf,CAAvB,CAAA,CACEE,CAAA,CAAY,EAAZ,CAAgBH,CAAAC,KAAA,EAAhB,CAIAG,EAAA,CAAuBT,CAAvB,CAAJ,EAAuCK,CAAAC,KAAA,EAAvC,EAAuDN,CAAvD,EACEQ,CAAA,CAAY,EAAZ,CAAgBR,CAAhB,CAKF,EAFAE,CAEA,CAFQQ,CAAA,CAAaV,CAAb,CAER,EAFiC,CAAEE,CAAAA,CAEnC,GACEG,CAAAM,KAAA,CAAWX,CAAX,CAEF,KAAIY,EAAQ,EAEZX,EAAAY,QAAA,CAAaC,CAAb,CACE,QAAQ,CAACC,CAAD,CAAQC,CAAR,CAAcC,CAAd,CAAiCC,CAAjC,CAAoDC,CAApD,CAAmE,CAMzEP,CAAA,CAAMI,CAAN,CAAA,CAAcI,CAAA,CALFH,CAKE,EAJTC,CAIS,EAHTC,CAGS,EAFT,EAES,CAN2D,CAD7E,CASItB,EAAAwB,MAAJ,EAAmBxB,CAAAwB,MAAA,CAAcrB,CAAd,CAAuBY,CAAvB,CAA8BV,CAA9B,CA5B6B,CA+BlDM,QAASA,EAAW,CAACT,CAAD,CAAMC,CAAN,CAAe,CAAA,IAC7BsB,EAAM,CADuB,CACpB7B,CAEb,IADAO,CACA,CADUrB,CAAAwB,UAAA,CAAkBH,CAAlB,CACV,CAEE,IAAKsB,CAAL,CAAWjB,CAAAX,OAAX,CAA0B,CAA1B,CAAoC,CAApC,EAA6B4B,CAA7B,EACMjB,CAAA,CAAMiB,CAAN,CADN,EACoBtB,CADpB,CAAuCsB,CAAA,EAAvC;AAIF,GAAW,CAAX,EAAIA,CAAJ,CAAc,CAEZ,IAAK7B,CAAL,CAASY,CAAAX,OAAT,CAAwB,CAAxB,CAA2BD,CAA3B,EAAgC6B,CAAhC,CAAqC7B,CAAA,EAArC,CACMI,CAAA0B,IAAJ,EAAiB1B,CAAA0B,IAAA,CAAYlB,CAAA,CAAMZ,CAAN,CAAZ,CAGnBY,EAAAX,OAAA,CAAe4B,CANH,CATmB,CA/Hf,QAApB,GAAI,MAAO1B,EAAX,GAEIA,CAFJ,CACe,IAAb,GAAIA,CAAJ,EAAqC,WAArC,GAAqB,MAAOA,EAA5B,CACS,EADT,CAGS,EAHT,CAGcA,CAJhB,CADiC,KAQ7B4B,CAR6B,CAQtB1C,CARsB,CAQRuB,EAAQ,EARA,CAQIC,EAAOV,CARX,CAQiB6B,CAGlD,KAFApB,CAAAC,KAEA,CAFaoB,QAAQ,EAAG,CAAE,MAAOrB,EAAA,CAAMA,CAAAX,OAAN,CAAqB,CAArB,CAAT,CAExB,CAAOE,CAAP,CAAA,CAAa,CACX6B,CAAA,CAAO,EACP3C,EAAA,CAAQ,CAAA,CAGR,IAAKuB,CAAAC,KAAA,EAAL,EAAsBqB,CAAA,CAAgBtB,CAAAC,KAAA,EAAhB,CAAtB,CA2DEV,CASA,CATOA,CAAAiB,QAAA,CAAa,IAAIe,MAAJ,CAAW,yBAAX,CAAuCvB,CAAAC,KAAA,EAAvC,CAAsD,QAAtD,CAAgE,GAAhE,CAAb,CACL,QAAQ,CAACuB,CAAD,CAAMJ,CAAN,CAAY,CAClBA,CAAA,CAAOA,CAAAZ,QAAA,CAAaiB,CAAb,CAA6B,IAA7B,CAAAjB,QAAA,CAA2CkB,CAA3C,CAAyD,IAAzD,CAEHlC,EAAAf,MAAJ,EAAmBe,CAAAf,MAAA,CAAcsC,CAAA,CAAeK,CAAf,CAAd,CAEnB,OAAO,EALW,CADf,CASP,CAAAjB,CAAA,CAAY,EAAZ,CAAgBH,CAAAC,KAAA,EAAhB,CApEF,KAAqD,CAGnD,GAA6B,CAA7B,GAAIV,CAAAoC,QAAA,CAAa,SAAb,CAAJ,CAEER,CAEA,CAFQ5B,CAAAoC,QAAA,CAAa,IAAb,CAAmB,CAAnB,CAER,CAAa,CAAb,EAAIR,CAAJ,EAAkB5B,CAAAqC,YAAA,CAAiB,QAAjB,CAAwBT,CAAxB,CAAlB,GAAqDA,CAArD,GACM3B,CAAAqC,QAEJ;AAFqBrC,CAAAqC,QAAA,CAAgBtC,CAAAuC,UAAA,CAAe,CAAf,CAAkBX,CAAlB,CAAhB,CAErB,CADA5B,CACA,CADOA,CAAAuC,UAAA,CAAeX,CAAf,CAAuB,CAAvB,CACP,CAAA1C,CAAA,CAAQ,CAAA,CAHV,CAJF,KAUO,IAAIsD,CAAAC,KAAA,CAAoBzC,CAApB,CAAJ,CAGL,IAFAmB,CAEA,CAFQnB,CAAAmB,MAAA,CAAWqB,CAAX,CAER,CACExC,CACA,CADOA,CAAAiB,QAAA,CAAaE,CAAA,CAAM,CAAN,CAAb,CAAuB,EAAvB,CACP,CAAAjC,CAAA,CAAQ,CAAA,CAFV,CAHK,IAQA,IAAIwD,CAAAD,KAAA,CAA4BzC,CAA5B,CAAJ,CAGL,IAFAmB,CAEA,CAFQnB,CAAAmB,MAAA,CAAWwB,CAAX,CAER,CACE3C,CAEA,CAFOA,CAAAuC,UAAA,CAAepB,CAAA,CAAM,CAAN,CAAArB,OAAf,CAEP,CADAqB,CAAA,CAAM,CAAN,CAAAF,QAAA,CAAiB0B,CAAjB,CAAiC/B,CAAjC,CACA,CAAA1B,CAAA,CAAQ,CAAA,CAHV,CAHK,IAUI0D,EAAAH,KAAA,CAAsBzC,CAAtB,CAAJ,GAGL,CAFAmB,CAEA,CAFQnB,CAAAmB,MAAA,CAAW0B,CAAX,CAER,GAEM1B,CAAA,CAAM,CAAN,CAIJ,GAHEnB,CACA,CADOA,CAAAuC,UAAA,CAAepB,CAAA,CAAM,CAAN,CAAArB,OAAf,CACP,CAAAqB,CAAA,CAAM,CAAN,CAAAF,QAAA,CAAiB4B,CAAjB,CAAmC3C,CAAnC,CAEF,EAAAhB,CAAA,CAAQ,CAAA,CANV,GASE2C,CACA,EADQ,GACR,CAAA7B,CAAA,CAAOA,CAAAuC,UAAA,CAAe,CAAf,CAVT,CAHK,CAiBHrD,EAAJ,GACE0C,CAKA,CALQ5B,CAAAoC,QAAA,CAAa,GAAb,CAKR,CAHAP,CAGA,EAHgB,CAAR,CAAAD,CAAA,CAAY5B,CAAZ,CAAmBA,CAAAuC,UAAA,CAAe,CAAf,CAAkBX,CAAlB,CAG3B,CAFA5B,CAEA,CAFe,CAAR,CAAA4B,CAAA,CAAY,EAAZ,CAAiB5B,CAAAuC,UAAA,CAAeX,CAAf,CAExB,CAAI3B,CAAAf,MAAJ,EAAmBe,CAAAf,MAAA,CAAcsC,CAAA,CAAeK,CAAf,CAAd,CANrB,CAhDmD,CAuErD,GAAI7B,CAAJ,EAAYU,CAAZ,CACE,KAAMoC,EAAA,CAAgB,UAAhB,CAC4C9C,CAD5C,CAAN,CAGFU,CAAA,CAAOV,CAhFI,CAoFbY,CAAA,EA/FiC,CA2JnCY,QAASA,EAAc,CAACuB,CAAD,CAAQ,CAC7B,GAAKA,CAAAA,CAAL,CAAc,MAAO,EAIrB,KAAIC,EAAQC,CAAAC,KAAA,CAAaH,CAAb,CACRI,EAAAA,CAAcH,CAAA,CAAM,CAAN,CAClB;IAAII,EAAaJ,CAAA,CAAM,CAAN,CAEjB,IADIK,CACJ,CADcL,CAAA,CAAM,CAAN,CACd,CACEM,CAAAC,UAKA,CALoBF,CAAApC,QAAA,CAAgB,IAAhB,CAAqB,MAArB,CAKpB,CAAAoC,CAAA,CAAU,aAAA,EAAiBC,EAAjB,CACRA,CAAAE,YADQ,CACgBF,CAAAG,UAE5B,OAAON,EAAP,CAAqBE,CAArB,CAA+BD,CAlBF,CA4B/BM,QAASA,EAAc,CAACX,CAAD,CAAQ,CAC7B,MAAOA,EAAA9B,QAAA,CACG,IADH,CACS,OADT,CAAAA,QAAA,CAEG0C,CAFH,CAE0B,QAAQ,CAACZ,CAAD,CAAQ,CAC7C,IAAIa,EAAKb,CAAAc,WAAA,CAAiB,CAAjB,CACLC,EAAAA,CAAMf,CAAAc,WAAA,CAAiB,CAAjB,CACV,OAAO,IAAP,EAAgC,IAAhC,EAAiBD,CAAjB,CAAsB,KAAtB,GAA0CE,CAA1C,CAAgD,KAAhD,EAA0D,KAA1D,EAAqE,GAHxB,CAF1C,CAAA7C,QAAA,CAOG8C,CAPH,CAO4B,QAAQ,CAAChB,CAAD,CAAQ,CAC/C,MAAO,IAAP,CAAcA,CAAAc,WAAA,CAAiB,CAAjB,CAAd,CAAoC,GADW,CAP5C,CAAA5C,QAAA,CAUG,IAVH,CAUS,MAVT,CAAAA,QAAA,CAWG,IAXH,CAWS,MAXT,CADsB,CAyB/B7B,QAASA,EAAkB,CAACD,CAAD,CAAM6E,CAAN,CAAoB,CAC7C,IAAIC,EAAS,CAAA,CAAb,CACIC,EAAMnF,CAAAoF,KAAA,CAAahF,CAAb,CAAkBA,CAAA4B,KAAlB,CACV,OAAO,CACLU,MAAOA,QAAQ,CAACtB,CAAD,CAAMa,CAAN,CAAaV,CAAb,CAAoB,CACjCH,CAAA,CAAMpB,CAAAwB,UAAA,CAAkBJ,CAAlB,CACD8D,EAAAA,CAAL,EAAelC,CAAA,CAAgB5B,CAAhB,CAAf,GACE8D,CADF,CACW9D,CADX,CAGK8D,EAAL,EAAsC,CAAA,CAAtC,GAAeG,CAAA,CAAcjE,CAAd,CAAf,GACE+D,CAAA,CAAI,GAAJ,CAcA,CAbAA,CAAA,CAAI/D,CAAJ,CAaA;AAZApB,CAAAsF,QAAA,CAAgBrD,CAAhB,CAAuB,QAAQ,CAAC+B,CAAD,CAAQuB,CAAR,CAAa,CAC1C,IAAIC,EAAKxF,CAAAwB,UAAA,CAAkB+D,CAAlB,CAAT,CACIE,EAAmB,KAAnBA,GAAWrE,CAAXqE,EAAqC,KAArCA,GAA4BD,CAA5BC,EAAyD,YAAzDA,GAAgDD,CAC3B,EAAA,CAAzB,GAAIE,CAAA,CAAWF,CAAX,CAAJ,EACsB,CAAA,CADtB,GACGG,CAAA,CAASH,CAAT,CADH,EAC8B,CAAAP,CAAA,CAAajB,CAAb,CAAoByB,CAApB,CAD9B,GAEEN,CAAA,CAAI,GAAJ,CAIA,CAHAA,CAAA,CAAII,CAAJ,CAGA,CAFAJ,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAIR,CAAA,CAAeX,CAAf,CAAJ,CACA,CAAAmB,CAAA,CAAI,GAAJ,CANF,CAH0C,CAA5C,CAYA,CAAAA,CAAA,CAAI5D,CAAA,CAAQ,IAAR,CAAe,GAAnB,CAfF,CALiC,CAD9B,CAwBLqB,IAAKA,QAAQ,CAACxB,CAAD,CAAM,CACfA,CAAA,CAAMpB,CAAAwB,UAAA,CAAkBJ,CAAlB,CACD8D,EAAL,EAAsC,CAAA,CAAtC,GAAeG,CAAA,CAAcjE,CAAd,CAAf,GACE+D,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAI/D,CAAJ,CACA,CAAA+D,CAAA,CAAI,GAAJ,CAHF,CAKI/D,EAAJ,EAAW8D,CAAX,GACEA,CADF,CACW,CAAA,CADX,CAPe,CAxBd,CAmCL/E,MAAOA,QAAQ,CAACA,CAAD,CAAQ,CACd+E,CAAL,EACEC,CAAA,CAAIR,CAAA,CAAexE,CAAf,CAAJ,CAFiB,CAnClB,CAHsC,CAtd/C,IAAI4D,EAAkB/D,CAAA4F,SAAA,CAAiB,WAAjB,CAAtB,CAyJI9B,EACG,wGA1JP,CA2JEF,EAAiB,wBA3JnB,CA4JEzB,EAAc,yEA5JhB;AA6JE0B,EAAmB,IA7JrB,CA8JEF,EAAyB,MA9J3B,CA+JER,EAAiB,qBA/JnB,CAgKEM,EAAiB,qBAhKnB,CAiKEL,EAAe,yBAjKjB,CAkKEwB,EAAwB,iCAlK1B,CAoKEI,EAA0B,gBApK5B,CA6KIjD,EAAetB,CAAA,CAAQ,wBAAR,CAIfoF,EAAAA,CAA8BpF,CAAA,CAAQ,gDAAR,CAC9BqF,EAAAA,CAA+BrF,CAAA,CAAQ,OAAR,CADnC,KAEIqB,EAAyB9B,CAAA+F,OAAA,CAAe,EAAf,CACeD,CADf,CAEeD,CAFf,CAF7B,CAOIpE,EAAgBzB,CAAA+F,OAAA,CAAe,EAAf,CAAmBF,CAAnB,CAAgDpF,CAAA,CAAQ,4KAAR,CAAhD,CAPpB,CAYImB,EAAiB5B,CAAA+F,OAAA,CAAe,EAAf,CAAmBD,CAAnB,CAAiDrF,CAAA,CAAQ,2JAAR,CAAjD,CAMjBuF;CAAAA,CAAcvF,CAAA,CAAQ,oRAAR,CAMlB,KAAIuC,EAAkBvC,CAAA,CAAQ,cAAR,CAAtB,CAEI4E,EAAgBrF,CAAA+F,OAAA,CAAe,EAAf,CACehE,CADf,CAEeN,CAFf,CAGeG,CAHf,CAIeE,CAJf,CAKekE,CALf,CAFpB,CAUIL,EAAWlF,CAAA,CAAQ,qDAAR,CAEXwF,EAAAA,CAAYxF,CAAA,CAAQ,ySAAR,CAQZyF;CAAAA,CAAWzF,CAAA,CAAQ,4vCAAR,CAiBf;IAAIiF,EAAa1F,CAAA+F,OAAA,CAAe,EAAf,CACeJ,CADf,CAEeO,CAFf,CAGeD,CAHf,CAAjB,CA4KI1B,EAAU4B,QAAAC,cAAA,CAAuB,KAAvB,CA5Kd,CA6KIlC,EAAU,wBA2GdlE,EAAAqG,OAAA,CAAe,YAAf,CAA6B,EAA7B,CAAAC,SAAA,CAA0C,WAA1C,CAlYAC,QAA0B,EAAG,CAC3B,IAAAC,KAAA,CAAY,CAAC,eAAD,CAAkB,QAAQ,CAACC,CAAD,CAAgB,CACpD,MAAO,SAAQ,CAACxF,CAAD,CAAO,CACpB,IAAIb,EAAM,EACVY,EAAA,CAAWC,CAAX,CAAiBZ,CAAA,CAAmBD,CAAnB,CAAwB,QAAQ,CAACsG,CAAD,CAAMjB,CAAN,CAAe,CAC9D,MAAO,CAAC,SAAA/B,KAAA,CAAe+C,CAAA,CAAcC,CAAd,CAAmBjB,CAAnB,CAAf,CADsD,CAA/C,CAAjB,CAGA,OAAOrF,EAAAI,KAAA,CAAS,EAAT,CALa,CAD8B,CAA1C,CADe,CAkY7B,CAwGAR,EAAAqG,OAAA,CAAe,YAAf,CAAAM,OAAA,CAAoC,OAApC,CAA6C,CAAC,WAAD,CAAc,QAAQ,CAACC,CAAD,CAAY,CAAA,IACzEC,EACE,wFAFuE,CAGzEC,EAAgB,UAEpB,OAAO,SAAQ,CAAChE,CAAD,CAAOiE,CAAP,CAAe,CAsB5BC,QAASA,EAAO,CAAClE,CAAD,CAAO,CAChBA,CAAL,EAGA7B,CAAAe,KAAA,CAAU9B,CAAA,CAAa4C,CAAb,CAAV,CAJqB,CAtBK;AA6B5BmE,QAASA,EAAO,CAACC,CAAD,CAAMpE,CAAN,CAAY,CAC1B7B,CAAAe,KAAA,CAAU,KAAV,CACIhC,EAAAmH,UAAA,CAAkBJ,CAAlB,CAAJ,EACE9F,CAAAe,KAAA,CAAU,UAAV,CACU+E,CADV,CAEU,IAFV,CAIF9F,EAAAe,KAAA,CAAU,QAAV,CACUkF,CAAAhF,QAAA,CAAY,IAAZ,CAAkB,QAAlB,CADV,CAEU,IAFV,CAGA8E,EAAA,CAAQlE,CAAR,CACA7B,EAAAe,KAAA,CAAU,MAAV,CAX0B,CA5B5B,GAAKc,CAAAA,CAAL,CAAW,MAAOA,EAMlB,KALA,IAAIV,CAAJ,CACIgF,EAAMtE,CADV,CAEI7B,EAAO,EAFX,CAGIiG,CAHJ,CAIIpG,CACJ,CAAQsB,CAAR,CAAgBgF,CAAAhF,MAAA,CAAUyE,CAAV,CAAhB,CAAA,CAEEK,CAQA,CARM9E,CAAA,CAAM,CAAN,CAQN,CANKA,CAAA,CAAM,CAAN,CAML,EANkBA,CAAA,CAAM,CAAN,CAMlB,GALE8E,CAKF,EALS9E,CAAA,CAAM,CAAN,CAAA,CAAW,SAAX,CAAuB,SAKhC,EAL6C8E,CAK7C,EAHApG,CAGA,CAHIsB,CAAAS,MAGJ,CAFAmE,CAAA,CAAQI,CAAAC,OAAA,CAAW,CAAX,CAAcvG,CAAd,CAAR,CAEA,CADAmG,CAAA,CAAQC,CAAR,CAAa9E,CAAA,CAAM,CAAN,CAAAF,QAAA,CAAiB4E,CAAjB,CAAgC,EAAhC,CAAb,CACA,CAAAM,CAAA,CAAMA,CAAA5D,UAAA,CAAc1C,CAAd,CAAkBsB,CAAA,CAAM,CAAN,CAAArB,OAAlB,CAERiG,EAAA,CAAQI,CAAR,CACA,OAAOR,EAAA,CAAU3F,CAAAT,KAAA,CAAU,EAAV,CAAV,CApBqB,CAL+C,CAAlC,CAA7C,CAhnBsC,CAArC,CAAD,CAmqBGT,MAnqBH,CAmqBWA,MAAAC,QAnqBX;", -"sources":["angular-sanitize.js"], -"names":["window","angular","undefined","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","makeMap","str","obj","items","split","i","length","htmlParser","html","handler","parseStartTag","tag","tagName","rest","unary","lowercase","blockElements","stack","last","inlineElements","parseEndTag","optionalEndTagElements","voidElements","push","attrs","replace","ATTR_REGEXP","match","name","doubleQuotedValue","singleQuotedValue","unquotedValue","decodeEntities","start","pos","end","index","text","stack.last","specialElements","RegExp","all","COMMENT_REGEXP","CDATA_REGEXP","indexOf","lastIndexOf","comment","substring","DOCTYPE_REGEXP","test","BEGING_END_TAGE_REGEXP","END_TAG_REGEXP","BEGIN_TAG_REGEXP","START_TAG_REGEXP","$sanitizeMinErr","value","parts","spaceRe","exec","spaceBefore","spaceAfter","content","hiddenPre","innerHTML","textContent","innerText","encodeEntities","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","uriValidator","ignore","out","bind","validElements","forEach","key","lkey","isImage","validAttrs","uriAttrs","$$minErr","optionalEndTagBlockElements","optionalEndTagInlineElements","extend","svgElements","htmlAttrs","svgAttrs","document","createElement","module","provider","$SanitizeProvider","$get","$$sanitizeUri","uri","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","target","addText","addLink","url","isDefined","raw","substr"] -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-scroll_0.5.7/angular-scroll.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-scroll_0.5.7/angular-scroll.min.js deleted file mode 100644 index d979dfe0..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-scroll_0.5.7/angular-scroll.min.js +++ /dev/null @@ -1 +0,0 @@ -var duScrollDefaultEasing=function(e){return.5>e?Math.pow(2*e,2)/2:1-Math.pow(2*(1-e),2)/2};angular.module("duScroll",["duScroll.scrollspy","duScroll.requestAnimation","duScroll.smoothScroll","duScroll.scrollContainer","duScroll.scrollHelpers"]).value("duScrollDuration",350).value("duScrollGreedy",!1).value("duScrollEasing",duScrollDefaultEasing),angular.module("duScroll.scrollHelpers",[]).run(["$window","$q","cancelAnimation","requestAnimation","duScrollEasing",function(e,t,n,r,o){var l=angular.element.prototype;this.$get=function(){return l};var i=function(e){return"undefined"!=typeof HTMLDocument&&e instanceof HTMLDocument||e.nodeType&&e.nodeType===e.DOCUMENT_NODE},u=function(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement||e.nodeType&&e.nodeType===e.ELEMENT_NODE},c=function(e){return u(e)||i(e)?e:e[0]};l.scrollTo=function(t,n,r){var o;if(angular.isElement(t)?o=this.scrollToElement:r&&(o=this.scrollToAnimated),o)return o.apply(this,arguments);var l=c(this);return i(l)?e.scrollTo(t,n):(l.scrollLeft=t,void(l.scrollTop=n))};var a,s;l.scrollToAnimated=function(e,l,i,u){i&&!u&&(u=o);var c=this.scrollLeft(),d=this.scrollTop(),f=Math.round(e-c),p=Math.round(l-d),m=null;a&&(n(a),s.reject());var g=this;if(s=t.defer(),!f&&!p)return s.resolve(),s.promise;var v=function(e){null===m&&(m=e);var t=e-m,n=t>=i?1:u(t/i);g.scrollTo(c+Math.ceil(f*n),d+Math.ceil(p*n)),1>n?a=r(v):(a=null,s.resolve())};return g.scrollTo(c,d),a=r(v),s.promise},l.scrollToElement=function(e,t,n,r){var o=c(this),l=this.scrollTop()+c(e).getBoundingClientRect().top-t;return u(o)&&(l-=o.getBoundingClientRect().top),this.scrollTo(0,l,n,r)};var d={scrollLeft:function(t,n,r){if(angular.isNumber(t))return this.scrollTo(t,this.scrollTop(),n,r);var o=c(this);return i(o)?e.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft:o.scrollLeft},scrollTop:function(t,n,r){if(angular.isNumber(t))return this.scrollTo(this.scrollTop(),t,n,r);var o=c(this);return i(o)?e.scrollY||document.documentElement.scrollTop||document.body.scrollTop:o.scrollTop}},f=function(e,t){return function(n,r){return r?t.apply(this,arguments):e.apply(this,arguments)}};for(var p in d)l[p]=l[p]?f(l[p],d[p]):d[p]}]),angular.module("duScroll.polyfill",[]).factory("polyfill",["$window",function(e){var t=["webkit","moz","o","ms"];return function(n,r){if(e[n])return e[n];for(var o,l=n.substr(0,1).toUpperCase()+n.substr(1),i=0;i',link:function(b,c,d,e){function f(b){var c=h;b?c=b.toString():a.isUndefined(h)&&(c=b),e.$setViewValue(c)}var g=c.find("input"),h=b.$eval(d.fallbackValue),i=function(a){b.$apply(function(){f(a)})},j=function(){return g.spectrum("toggle"),!1},k=a.extend({color:e.$viewValue,change:i,move:i,hide:i},b.$eval(d.options));d.triggerId&&a.element(document.body).on("click","#"+d.triggerId,j),e.$render=function(){g.spectrum("set",e.$viewValue||"")},k.color&&(g.spectrum("set",k.color||""),f(k.color)),g.spectrum(k),b.$on("$destroy",function(){g.spectrum("destroy")})}}})}(angular); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-spectrum-colorpicker_1.0.13/spectrum.css b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-spectrum-colorpicker_1.0.13/spectrum.css deleted file mode 100644 index 6a83b725..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-spectrum-colorpicker_1.0.13/spectrum.css +++ /dev/null @@ -1,519 +0,0 @@ -/*** -Spectrum Colorpicker v1.3.4 -https://github.com/bgrins/spectrum -Author: Brian Grinstead -License: MIT -***/ - -.sp-container { - position:absolute; - top:0; - left:0; - display:inline-block; - *display: inline; - *zoom: 1; - /* https://github.com/bgrins/spectrum/issues/40 */ - z-index: 9999994; - overflow: hidden; -} -.sp-container.sp-flat { - position: relative; -} - -/* Fix for * { box-sizing: border-box; } */ -.sp-container, -.sp-container * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ -.sp-top { - position:relative; - width: 100%; - display:inline-block; -} -.sp-top-inner { - position:absolute; - top:0; - left:0; - bottom:0; - right:0; -} -.sp-color { - position: absolute; - top:0; - left:0; - bottom:0; - right:20%; -} -.sp-hue { - position: absolute; - top:0; - right:0; - bottom:0; - left:84%; - height: 100%; -} - -.sp-clear-enabled .sp-hue { - top:33px; - height: 77.5%; -} - -.sp-fill { - padding-top: 80%; -} -.sp-sat, .sp-val { - position: absolute; - top:0; - left:0; - right:0; - bottom:0; -} - -.sp-alpha-enabled .sp-top { - margin-bottom: 18px; -} -.sp-alpha-enabled .sp-alpha { - display: block; -} -.sp-alpha-handle { - position:absolute; - top:-4px; - bottom: -4px; - width: 6px; - left: 50%; - cursor: pointer; - border: 1px solid black; - background: white; - opacity: .8; -} -.sp-alpha { - display: none; - position: absolute; - bottom: -14px; - right: 0; - left: 0; - height: 8px; -} -.sp-alpha-inner { - border: solid 1px #333; -} - -.sp-clear { - display: none; -} - -.sp-clear.sp-clear-display { - background-position: center; -} - -.sp-clear-enabled .sp-clear { - display: block; - position:absolute; - top:0px; - right:0; - bottom:0; - left:84%; - height: 28px; -} - -/* Don't allow text selection */ -.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { - -webkit-user-select:none; - -moz-user-select: -moz-none; - -o-user-select:none; - user-select: none; -} - -.sp-container.sp-input-disabled .sp-input-container { - display: none; -} -.sp-container.sp-buttons-disabled .sp-button-container { - display: none; -} -.sp-palette-only .sp-picker-container { - display: none; -} -.sp-palette-disabled .sp-palette-container { - display: none; -} - -.sp-initial-disabled .sp-initial { - display: none; -} - - -/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ -.sp-sat { - background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; - filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); -} -.sp-val { - background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; - filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); -} - -.sp-hue { - background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); - background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); -} - -/* IE filters do not support multiple color stops. - Generate 6 divs, line them up, and do two color gradients for each. - Yes, really. - */ -.sp-1 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); -} -.sp-2 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); -} -.sp-3 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); -} -.sp-4 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); -} -.sp-5 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); -} -.sp-6 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); -} - -.sp-hidden { - display: none !important; -} - -/* Clearfix hack */ -.sp-cf:before, .sp-cf:after { content: ""; display: table; } -.sp-cf:after { clear: both; } -.sp-cf { *zoom: 1; } - -/* Mobile devices, make hue slider bigger so it is easier to slide */ -@media (max-device-width: 480px) { - .sp-color { right: 40%; } - .sp-hue { left: 63%; } - .sp-fill { padding-top: 60%; } -} -.sp-dragger { - border-radius: 5px; - height: 5px; - width: 5px; - border: 1px solid #fff; - background: #000; - cursor: pointer; - position:absolute; - top:0; - left: 0; -} -.sp-slider { - position: absolute; - top:0; - cursor:pointer; - height: 3px; - left: -1px; - right: -1px; - border: 1px solid #000; - background: white; - opacity: .8; -} - -/* -Theme authors: -Here are the basic themeable display options (colors, fonts, global widths). -See http://bgrins.github.io/spectrum/themes/ for instructions. -*/ - -.sp-container { - border-radius: 0; - background-color: #ECECEC; - border: solid 1px #f0c49B; - padding: 0; -} -.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear -{ - font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.sp-top -{ - margin-bottom: 3px; -} -.sp-color, .sp-hue, .sp-clear -{ - border: solid 1px #666; -} - -/* Input */ -.sp-input-container { - float:right; - width: 100px; - margin-bottom: 4px; -} -.sp-initial-disabled .sp-input-container { - width: 100%; -} -.sp-input { - font-size: 12px !important; - border: 1px inset; - padding: 4px 5px; - margin: 0; - width: 100%; - background:transparent; - border-radius: 3px; - color: #222; -} -.sp-input:focus { - border: 1px solid orange; -} -.sp-input.sp-validation-error -{ - border: 1px solid red; - background: #fdd; -} -.sp-picker-container , .sp-palette-container -{ - float:left; - position: relative; - padding: 10px; - padding-bottom: 300px; - margin-bottom: -290px; -} -.sp-picker-container -{ - width: 172px; - border-left: solid 1px #fff; -} - -/* Palettes */ -.sp-palette-container -{ - border-right: solid 1px #ccc; -} - -.sp-palette .sp-thumb-el { - display: block; - position:relative; - float:left; - width: 24px; - height: 15px; - margin: 3px; - cursor: pointer; - border:solid 2px transparent; -} -.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { - border-color: orange; -} -.sp-thumb-el -{ - position:relative; -} - -/* Initial */ -.sp-initial -{ - float: left; - border: solid 1px #333; -} -.sp-initial span { - width: 30px; - height: 25px; - border:none; - display:block; - float:left; - margin:0; -} - -.sp-initial .sp-clear-display { - background-position: center; -} - -/* Buttons */ -.sp-button-container { - float: right; -} - -/* Replacer (the little preview div that shows up instead of the ) */ -.sp-replacer { - margin:0; - overflow:hidden; - cursor:pointer; - padding: 4px; - display:inline-block; - *zoom: 1; - *display: inline; - border: solid 1px #91765d; - background: #eee; - color: #333; - vertical-align: middle; -} -.sp-replacer:hover, .sp-replacer.sp-active { - border-color: #F0C49B; - color: #111; -} -.sp-replacer.sp-disabled { - cursor:default; - border-color: silver; - color: silver; -} -.sp-dd { - padding: 2px 0; - height: 16px; - line-height: 16px; - float:left; - font-size:10px; -} -.sp-preview -{ - position:relative; - width:25px; - height: 20px; - border: solid 1px #222; - margin-right: 5px; - float:left; - z-index: 0; -} - -.sp-palette -{ - *width: 220px; - max-width: 220px; -} -.sp-palette .sp-thumb-el -{ - width:16px; - height: 16px; - margin:2px 1px; - border: solid 1px #d0d0d0; -} - -.sp-container -{ - padding-bottom:0; -} - - -/* Buttons: http://hellohappy.org/css3-buttons/ */ -.sp-container button { - background-color: #eeeeee; - background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); - background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); - background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); - background-image: -o-linear-gradient(top, #eeeeee, #cccccc); - background-image: linear-gradient(to bottom, #eeeeee, #cccccc); - border: 1px solid #ccc; - border-bottom: 1px solid #bbb; - border-radius: 3px; - color: #333; - font-size: 14px; - line-height: 1; - padding: 5px 4px; - text-align: center; - text-shadow: 0 1px 0 #eee; - vertical-align: middle; -} -.sp-container button:hover { - background-color: #dddddd; - background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); - background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); - border: 1px solid #bbb; - border-bottom: 1px solid #999; - cursor: pointer; - text-shadow: 0 1px 0 #ddd; -} -.sp-container button:active { - border: 1px solid #aaa; - border-bottom: 1px solid #888; - -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; -} -.sp-cancel -{ - font-size: 11px; - color: #d93f3f !important; - margin:0; - padding:2px; - margin-right: 5px; - vertical-align: middle; - text-decoration:none; - -} -.sp-cancel:hover -{ - color: #d93f3f !important; - text-decoration: underline; -} - - -.sp-palette span:hover, .sp-palette span.sp-thumb-active -{ - border-color: #000; -} - -.sp-preview, .sp-alpha, .sp-thumb-el -{ - position:relative; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); -} -.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner -{ - display:block; - position:absolute; - top:0;left:0;bottom:0;right:0; -} - -.sp-palette .sp-thumb-inner -{ - background-position: 50% 50%; - background-repeat: no-repeat; -} - -.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner -{ - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); -} - -.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner -{ - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); -} - -.sp-clear-display { - background-repeat:no-repeat; - background-position: center; - background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); -} diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-spectrum-colorpicker_1.0.13/spectrum.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-spectrum-colorpicker_1.0.13/spectrum.js deleted file mode 100644 index 8ced40ae..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-spectrum-colorpicker_1.0.13/spectrum.js +++ /dev/null @@ -1,2080 +0,0 @@ -// Spectrum Colorpicker v1.3.4 -// https://github.com/bgrins/spectrum -// Author: Brian Grinstead -// License: MIT - -(function (window, $, undefined) { - var defaultOpts = { - - // Callbacks - beforeShow: noop, - move: noop, - change: noop, - show: noop, - hide: noop, - - // Options - color: false, - flat: false, - showInput: false, - allowEmpty: false, - showButtons: true, - clickoutFiresChange: false, - showInitial: false, - showPalette: false, - showPaletteOnly: false, - showSelectionPalette: true, - localStorageKey: false, - appendTo: "body", - maxSelectionSize: 7, - cancelText: "cancel", - chooseText: "choose", - clearText: "Clear Color Selection", - preferredFormat: false, - className: "", // Deprecated - use containerClassName and replacerClassName instead. - containerClassName: "", - replacerClassName: "", - showAlpha: false, - theme: "sp-light", - palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]], - selectionPalette: [], - disabled: false - }, - spectrums = [], - IE = !!/msie/i.exec( window.navigator.userAgent ), - rgbaSupport = (function() { - function contains( str, substr ) { - return !!~('' + str).indexOf(substr); - } - - var elem = document.createElement('div'); - var style = elem.style; - style.cssText = 'background-color:rgba(0,0,0,.5)'; - return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla'); - })(), - inputTypeColorSupport = (function() { - var colorInput = $("")[0]; - return colorInput.type === "color" && colorInput.value !== "!"; - })(), - replaceInput = [ - "
    ", - "
    ", - "
    ", - "
    " - ].join(''), - markup = (function () { - - // IE does not support gradients with multiple stops, so we need to simulate - // that for the rainbow slider with 8 divs that each have a single gradient - var gradientFix = ""; - if (IE) { - for (var i = 1; i <= 6; i++) { - gradientFix += "
    "; - } - } - - return [ - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - gradientFix, - "
    ", - "
    ", - "
    ", - "
    ", - "
    ", - "", - "
    ", - "
    ", - "
    ", - "", - "", - "
    ", - "
    ", - "
    " - ].join(""); - })(); - - function paletteTemplate (p, color, className, tooltipFormat) { - var html = []; - for (var i = 0; i < p.length; i++) { - var current = p[i]; - if(current) { - var tiny = tinycolor(current); - var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light"; - c += (tinycolor.equals(color, current)) ? " sp-thumb-active" : ""; - - var formattedString = tiny.toString(tooltipFormat || "rgb"); - var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter(); - html.push(''); - } else { - var cls = 'sp-clear-display'; - html.push(''); - } - } - return "
    " + html.join('') + "
    "; - } - - function hideAll() { - for (var i = 0; i < spectrums.length; i++) { - if (spectrums[i]) { - spectrums[i].hide(); - } - } - } - - function instanceOptions(o, callbackContext) { - var opts = $.extend({}, defaultOpts, o); - opts.callbacks = { - 'move': bind(opts.move, callbackContext), - 'change': bind(opts.change, callbackContext), - 'show': bind(opts.show, callbackContext), - 'hide': bind(opts.hide, callbackContext), - 'beforeShow': bind(opts.beforeShow, callbackContext) - }; - - return opts; - } - - function spectrum(element, o) { - - var opts = instanceOptions(o, element), - flat = opts.flat, - showSelectionPalette = opts.showSelectionPalette, - localStorageKey = opts.localStorageKey, - theme = opts.theme, - callbacks = opts.callbacks, - resize = throttle(reflow, 10), - visible = false, - dragWidth = 0, - dragHeight = 0, - dragHelperHeight = 0, - slideHeight = 0, - slideWidth = 0, - alphaWidth = 0, - alphaSlideHelperWidth = 0, - slideHelperHeight = 0, - currentHue = 0, - currentSaturation = 0, - currentValue = 0, - currentAlpha = 1, - palette = [], - paletteArray = [], - paletteLookup = {}, - selectionPalette = opts.selectionPalette.slice(0), - maxSelectionSize = opts.maxSelectionSize, - draggingClass = "sp-dragging", - shiftMovementDirection = null; - - var doc = element.ownerDocument, - body = doc.body, - boundElement = $(element), - disabled = false, - container = $(markup, doc).addClass(theme), - dragger = container.find(".sp-color"), - dragHelper = container.find(".sp-dragger"), - slider = container.find(".sp-hue"), - slideHelper = container.find(".sp-slider"), - alphaSliderInner = container.find(".sp-alpha-inner"), - alphaSlider = container.find(".sp-alpha"), - alphaSlideHelper = container.find(".sp-alpha-handle"), - textInput = container.find(".sp-input"), - paletteContainer = container.find(".sp-palette"), - initialColorContainer = container.find(".sp-initial"), - cancelButton = container.find(".sp-cancel"), - clearButton = container.find(".sp-clear"), - chooseButton = container.find(".sp-choose"), - isInput = boundElement.is("input"), - isInputTypeColor = isInput && inputTypeColorSupport && boundElement.attr("type") === "color", - shouldReplace = isInput && !flat, - replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]), - offsetElement = (shouldReplace) ? replacer : boundElement, - previewElement = replacer.find(".sp-preview-inner"), - initialColor = opts.color || (isInput && boundElement.val()), - colorOnShow = false, - preferredFormat = opts.preferredFormat, - currentPreferredFormat = preferredFormat, - clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange, - isEmpty = !initialColor, - allowEmpty = opts.allowEmpty && !isInputTypeColor; - - function applyOptions() { - - if (opts.showPaletteOnly) { - opts.showPalette = true; - } - - if (opts.palette) { - palette = opts.palette.slice(0); - paletteArray = $.isArray(palette[0]) ? palette : [palette]; - paletteLookup = {}; - for (var i = 0; i < paletteArray.length; i++) { - for (var j = 0; j < paletteArray[i].length; j++) { - var rgb = tinycolor(paletteArray[i][j]).toRgbString(); - paletteLookup[rgb] = true; - } - } - } - - container.toggleClass("sp-flat", flat); - container.toggleClass("sp-input-disabled", !opts.showInput); - container.toggleClass("sp-alpha-enabled", opts.showAlpha); - container.toggleClass("sp-clear-enabled", allowEmpty); - container.toggleClass("sp-buttons-disabled", !opts.showButtons); - container.toggleClass("sp-palette-disabled", !opts.showPalette); - container.toggleClass("sp-palette-only", opts.showPaletteOnly); - container.toggleClass("sp-initial-disabled", !opts.showInitial); - container.addClass(opts.className).addClass(opts.containerClassName); - - reflow(); - } - - function initialize() { - - if (IE) { - container.find("*:not(input)").attr("unselectable", "on"); - } - - applyOptions(); - - if (shouldReplace) { - boundElement.after(replacer).hide(); - } - - if (!allowEmpty) { - clearButton.hide(); - } - - if (flat) { - boundElement.after(container).hide(); - } - else { - - var appendTo = opts.appendTo === "parent" ? boundElement.parent() : $(opts.appendTo); - if (appendTo.length !== 1) { - appendTo = $("body"); - } - - appendTo.append(container); - } - - updateSelectionPaletteFromStorage(); - - offsetElement.bind("click.spectrum touchstart.spectrum", function (e) { - if (!disabled) { - toggle(); - } - - e.stopPropagation(); - - if (!$(e.target).is("input")) { - e.preventDefault(); - } - }); - - if(boundElement.is(":disabled") || (opts.disabled === true)) { - disable(); - } - - // Prevent clicks from bubbling up to document. This would cause it to be hidden. - container.click(stopPropagation); - - // Handle user typed input - textInput.change(setFromTextInput); - textInput.bind("paste", function () { - setTimeout(setFromTextInput, 1); - }); - textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } }); - - cancelButton.text(opts.cancelText); - cancelButton.bind("click.spectrum", function (e) { - e.stopPropagation(); - e.preventDefault(); - hide("cancel"); - }); - - clearButton.attr("title", opts.clearText); - clearButton.bind("click.spectrum", function (e) { - e.stopPropagation(); - e.preventDefault(); - isEmpty = true; - move(); - - if(flat) { - //for the flat style, this is a change event - updateOriginalInput(true); - } - }); - - chooseButton.text(opts.chooseText); - chooseButton.bind("click.spectrum", function (e) { - e.stopPropagation(); - e.preventDefault(); - - if (isValid()) { - updateOriginalInput(true); - hide(); - } - }); - - draggable(alphaSlider, function (dragX, dragY, e) { - currentAlpha = (dragX / alphaWidth); - isEmpty = false; - if (e.shiftKey) { - currentAlpha = Math.round(currentAlpha * 10) / 10; - } - - move(); - }, dragStart, dragStop); - - draggable(slider, function (dragX, dragY) { - currentHue = parseFloat(dragY / slideHeight); - isEmpty = false; - if (!opts.showAlpha) { - currentAlpha = 1; - } - move(); - }, dragStart, dragStop); - - draggable(dragger, function (dragX, dragY, e) { - - // shift+drag should snap the movement to either the x or y axis. - if (!e.shiftKey) { - shiftMovementDirection = null; - } - else if (!shiftMovementDirection) { - var oldDragX = currentSaturation * dragWidth; - var oldDragY = dragHeight - (currentValue * dragHeight); - var furtherFromX = Math.abs(dragX - oldDragX) > Math.abs(dragY - oldDragY); - - shiftMovementDirection = furtherFromX ? "x" : "y"; - } - - var setSaturation = !shiftMovementDirection || shiftMovementDirection === "x"; - var setValue = !shiftMovementDirection || shiftMovementDirection === "y"; - - if (setSaturation) { - currentSaturation = parseFloat(dragX / dragWidth); - } - if (setValue) { - currentValue = parseFloat((dragHeight - dragY) / dragHeight); - } - - isEmpty = false; - if (!opts.showAlpha) { - currentAlpha = 1; - } - - move(); - - }, dragStart, dragStop); - - if (!!initialColor) { - set(initialColor); - - // In case color was black - update the preview UI and set the format - // since the set function will not run (default color is black). - updateUI(); - currentPreferredFormat = preferredFormat || tinycolor(initialColor).format; - - addColorToSelectionPalette(initialColor); - } - else { - updateUI(); - } - - if (flat) { - show(); - } - - function palletElementClick(e) { - if (e.data && e.data.ignore) { - set($(this).data("color")); - move(); - } - else { - set($(this).data("color")); - move(); - updateOriginalInput(true); - hide(); - } - - return false; - } - - var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum"; - paletteContainer.delegate(".sp-thumb-el", paletteEvent, palletElementClick); - initialColorContainer.delegate(".sp-thumb-el:nth-child(1)", paletteEvent, { ignore: true }, palletElementClick); - } - - function updateSelectionPaletteFromStorage() { - - if (localStorageKey && window.localStorage) { - - // Migrate old palettes over to new format. May want to remove this eventually. - try { - var oldPalette = window.localStorage[localStorageKey].split(",#"); - if (oldPalette.length > 1) { - delete window.localStorage[localStorageKey]; - $.each(oldPalette, function(i, c) { - addColorToSelectionPalette(c); - }); - } - } - catch(e) { } - - try { - selectionPalette = window.localStorage[localStorageKey].split(";"); - } - catch (e) { } - } - } - - function addColorToSelectionPalette(color) { - if (showSelectionPalette) { - var rgb = tinycolor(color).toRgbString(); - if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) { - selectionPalette.push(rgb); - while(selectionPalette.length > maxSelectionSize) { - selectionPalette.shift(); - } - } - - if (localStorageKey && window.localStorage) { - try { - window.localStorage[localStorageKey] = selectionPalette.join(";"); - } - catch(e) { } - } - } - } - - function getUniqueSelectionPalette() { - var unique = []; - if (opts.showPalette) { - for (i = 0; i < selectionPalette.length; i++) { - var rgb = tinycolor(selectionPalette[i]).toRgbString(); - - if (!paletteLookup[rgb]) { - unique.push(selectionPalette[i]); - } - } - } - - return unique.reverse().slice(0, opts.maxSelectionSize); - } - - function drawPalette() { - - var currentColor = get(); - - var html = $.map(paletteArray, function (palette, i) { - return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i, opts.preferredFormat); - }); - - updateSelectionPaletteFromStorage(); - - if (selectionPalette) { - html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection", opts.preferredFormat)); - } - - paletteContainer.html(html.join("")); - } - - function drawInitial() { - if (opts.showInitial) { - var initial = colorOnShow; - var current = get(); - initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial", opts.preferredFormat)); - } - } - - function dragStart() { - if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) { - reflow(); - } - container.addClass(draggingClass); - shiftMovementDirection = null; - boundElement.trigger('dragstart.spectrum', [ get() ]); - } - - function dragStop() { - container.removeClass(draggingClass); - boundElement.trigger('dragstop.spectrum', [ get() ]); - } - - function setFromTextInput() { - - var value = textInput.val(); - - if ((value === null || value === "") && allowEmpty) { - set(null); - updateOriginalInput(true); - } - else { - var tiny = tinycolor(value); - if (tiny.ok) { - set(tiny); - updateOriginalInput(true); - } - else { - textInput.addClass("sp-validation-error"); - } - } - } - - function toggle() { - if (visible) { - hide(); - } - else { - show(); - } - } - - function show() { - var event = $.Event('beforeShow.spectrum'); - - if (visible) { - reflow(); - return; - } - - boundElement.trigger(event, [ get() ]); - - if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) { - return; - } - - hideAll(); - visible = true; - - $(doc).bind("click.spectrum", hide); - $(window).bind("resize.spectrum", resize); - replacer.addClass("sp-active"); - container.removeClass("sp-hidden"); - - reflow(); - updateUI(); - - colorOnShow = get(); - - drawInitial(); - callbacks.show(colorOnShow); - boundElement.trigger('show.spectrum', [ colorOnShow ]); - } - - function hide(e) { - - // Return on right click - if (e && e.type == "click" && e.button == 2) { return; } - - // Return if hiding is unnecessary - if (!visible || flat) { return; } - visible = false; - - $(doc).unbind("click.spectrum", hide); - $(window).unbind("resize.spectrum", resize); - - replacer.removeClass("sp-active"); - container.addClass("sp-hidden"); - - var colorHasChanged = !tinycolor.equals(get(), colorOnShow); - - if (colorHasChanged) { - if (clickoutFiresChange && e !== "cancel") { - updateOriginalInput(true); - } - else { - revert(); - } - } - - callbacks.hide(get()); - boundElement.trigger('hide.spectrum', [ get() ]); - } - - function revert() { - set(colorOnShow, true); - } - - function set(color, ignoreFormatChange) { - if (tinycolor.equals(color, get())) { - // Update UI just in case a validation error needs - // to be cleared. - updateUI(); - return; - } - - var newColor, newHsv; - if (!color && allowEmpty) { - isEmpty = true; - } else { - isEmpty = false; - newColor = tinycolor(color); - newHsv = newColor.toHsv(); - - currentHue = (newHsv.h % 360) / 360; - currentSaturation = newHsv.s; - currentValue = newHsv.v; - currentAlpha = newHsv.a; - } - updateUI(); - - if (newColor && newColor.ok && !ignoreFormatChange) { - currentPreferredFormat = preferredFormat || newColor.format; - } - } - - function get(opts) { - opts = opts || { }; - - if (allowEmpty && isEmpty) { - return null; - } - - return tinycolor.fromRatio({ - h: currentHue, - s: currentSaturation, - v: currentValue, - a: Math.round(currentAlpha * 100) / 100 - }, { format: opts.format || currentPreferredFormat }); - } - - function isValid() { - return !textInput.hasClass("sp-validation-error"); - } - - function move() { - updateUI(); - - callbacks.move(get()); - boundElement.trigger('move.spectrum', [ get() ]); - } - - function updateUI() { - - textInput.removeClass("sp-validation-error"); - - updateHelperLocations(); - - // Update dragger background color (gradients take care of saturation and value). - var flatColor = tinycolor.fromRatio({ h: currentHue, s: 1, v: 1 }); - dragger.css("background-color", flatColor.toHexString()); - - // Get a format that alpha will be included in (hex and names ignore alpha) - var format = currentPreferredFormat; - if (currentAlpha < 1 && !(currentAlpha === 0 && format === "name")) { - if (format === "hex" || format === "hex3" || format === "hex6" || format === "name") { - format = "rgb"; - } - } - - var realColor = get({ format: format }), - displayColor = ''; - - //reset background info for preview element - previewElement.removeClass("sp-clear-display"); - previewElement.css('background-color', 'transparent'); - - if (!realColor && allowEmpty) { - // Update the replaced elements background with icon indicating no color selection - previewElement.addClass("sp-clear-display"); - } - else { - var realHex = realColor.toHexString(), - realRgb = realColor.toRgbString(); - - // Update the replaced elements background color (with actual selected color) - if (rgbaSupport || realColor.alpha === 1) { - previewElement.css("background-color", realRgb); - } - else { - previewElement.css("background-color", "transparent"); - previewElement.css("filter", realColor.toFilter()); - } - - if (opts.showAlpha) { - var rgb = realColor.toRgb(); - rgb.a = 0; - var realAlpha = tinycolor(rgb).toRgbString(); - var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")"; - - if (IE) { - alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex)); - } - else { - alphaSliderInner.css("background", "-webkit-" + gradient); - alphaSliderInner.css("background", "-moz-" + gradient); - alphaSliderInner.css("background", "-ms-" + gradient); - // Use current syntax gradient on unprefixed property. - alphaSliderInner.css("background", - "linear-gradient(to right, " + realAlpha + ", " + realHex + ")"); - } - } - - displayColor = realColor.toString(format); - } - - // Update the text entry input as it changes happen - if (opts.showInput) { - textInput.val(displayColor); - } - - if (opts.showPalette) { - drawPalette(); - } - - drawInitial(); - } - - function updateHelperLocations() { - var s = currentSaturation; - var v = currentValue; - - if(allowEmpty && isEmpty) { - //if selected color is empty, hide the helpers - alphaSlideHelper.hide(); - slideHelper.hide(); - dragHelper.hide(); - } - else { - //make sure helpers are visible - alphaSlideHelper.show(); - slideHelper.show(); - dragHelper.show(); - - // Where to show the little circle in that displays your current selected color - var dragX = s * dragWidth; - var dragY = dragHeight - (v * dragHeight); - dragX = Math.max( - -dragHelperHeight, - Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight) - ); - dragY = Math.max( - -dragHelperHeight, - Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight) - ); - dragHelper.css({ - "top": dragY + "px", - "left": dragX + "px" - }); - - var alphaX = currentAlpha * alphaWidth; - alphaSlideHelper.css({ - "left": (alphaX - (alphaSlideHelperWidth / 2)) + "px" - }); - - // Where to show the bar that displays your current selected hue - var slideY = (currentHue) * slideHeight; - slideHelper.css({ - "top": (slideY - slideHelperHeight) + "px" - }); - } - } - - function updateOriginalInput(fireCallback) { - var color = get(), - displayColor = '', - hasChanged = !tinycolor.equals(color, colorOnShow); - - if (color) { - displayColor = color.toString(currentPreferredFormat); - // Update the selection palette with the current color - addColorToSelectionPalette(color); - } - - if (isInput) { - boundElement.val(displayColor); - } - - colorOnShow = color; - - if (fireCallback && hasChanged) { - callbacks.change(color); - boundElement.trigger('change', [ color ]); - } - } - - function reflow() { - dragWidth = dragger.width(); - dragHeight = dragger.height(); - dragHelperHeight = dragHelper.height(); - slideWidth = slider.width(); - slideHeight = slider.height(); - slideHelperHeight = slideHelper.height(); - alphaWidth = alphaSlider.width(); - alphaSlideHelperWidth = alphaSlideHelper.width(); - - if (!flat) { - container.css("position", "absolute"); - container.offset(getOffset(container, offsetElement)); - } - - updateHelperLocations(); - - if (opts.showPalette) { - drawPalette(); - } - - boundElement.trigger('reflow.spectrum'); - } - - function destroy() { - boundElement.show(); - offsetElement.unbind("click.spectrum touchstart.spectrum"); - container.remove(); - replacer.remove(); - spectrums[spect.id] = null; - } - - function option(optionName, optionValue) { - if (optionName === undefined) { - return $.extend({}, opts); - } - if (optionValue === undefined) { - return opts[optionName]; - } - - opts[optionName] = optionValue; - applyOptions(); - } - - function enable() { - disabled = false; - boundElement.attr("disabled", false); - offsetElement.removeClass("sp-disabled"); - } - - function disable() { - hide(); - disabled = true; - boundElement.attr("disabled", true); - offsetElement.addClass("sp-disabled"); - } - - initialize(); - - var spect = { - show: show, - hide: hide, - toggle: toggle, - reflow: reflow, - option: option, - enable: enable, - disable: disable, - set: function (c) { - set(c); - updateOriginalInput(); - }, - get: get, - destroy: destroy, - container: container - }; - - spect.id = spectrums.push(spect) - 1; - - return spect; - } - - /** - * checkOffset - get the offset below/above and left/right element depending on screen position - * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js - */ - function getOffset(picker, input) { - var extraY = 0; - var dpWidth = picker.outerWidth(); - var dpHeight = picker.outerHeight(); - var inputHeight = input.outerHeight(); - var doc = picker[0].ownerDocument; - var docElem = doc.documentElement; - var viewWidth = docElem.clientWidth + $(doc).scrollLeft(); - var viewHeight = docElem.clientHeight + $(doc).scrollTop(); - var offset = input.offset(); - offset.top += inputHeight; - - offset.left -= - Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? - Math.abs(offset.left + dpWidth - viewWidth) : 0); - - offset.top -= - Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? - Math.abs(dpHeight + inputHeight - extraY) : extraY)); - - return offset; - } - - /** - * noop - do nothing - */ - function noop() { - - } - - /** - * stopPropagation - makes the code only doing this a little easier to read in line - */ - function stopPropagation(e) { - e.stopPropagation(); - } - - /** - * Create a function bound to a given object - * Thanks to underscore.js - */ - function bind(func, obj) { - var slice = Array.prototype.slice; - var args = slice.call(arguments, 2); - return function () { - return func.apply(obj, args.concat(slice.call(arguments))); - }; - } - - /** - * Lightweight drag helper. Handles containment within the element, so that - * when dragging, the x is within [0,element.width] and y is within [0,element.height] - */ - function draggable(element, onmove, onstart, onstop) { - onmove = onmove || function () { }; - onstart = onstart || function () { }; - onstop = onstop || function () { }; - var doc = element.ownerDocument || document; - var dragging = false; - var offset = {}; - var maxHeight = 0; - var maxWidth = 0; - var hasTouch = ('ontouchstart' in window); - - var duringDragEvents = {}; - duringDragEvents["selectstart"] = prevent; - duringDragEvents["dragstart"] = prevent; - duringDragEvents["touchmove mousemove"] = move; - duringDragEvents["touchend mouseup"] = stop; - - function prevent(e) { - if (e.stopPropagation) { - e.stopPropagation(); - } - if (e.preventDefault) { - e.preventDefault(); - } - e.returnValue = false; - } - - function move(e) { - if (dragging) { - // Mouseup happened outside of window - if (IE && document.documentMode < 9 && !e.button) { - return stop(); - } - - var touches = e.originalEvent.touches; - var pageX = touches ? touches[0].pageX : e.pageX; - var pageY = touches ? touches[0].pageY : e.pageY; - - var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth)); - var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight)); - - if (hasTouch) { - // Stop scrolling in iOS - prevent(e); - } - - onmove.apply(element, [dragX, dragY, e]); - } - } - - function start(e) { - var rightclick = (e.which) ? (e.which == 3) : (e.button == 2); - var touches = e.originalEvent.touches; - - if (!rightclick && !dragging) { - if (onstart.apply(element, arguments) !== false) { - dragging = true; - maxHeight = $(element).height(); - maxWidth = $(element).width(); - offset = $(element).offset(); - - $(doc).bind(duringDragEvents); - $(doc.body).addClass("sp-dragging"); - - if (!hasTouch) { - move(e); - } - - prevent(e); - } - } - } - - function stop() { - if (dragging) { - $(doc).unbind(duringDragEvents); - $(doc.body).removeClass("sp-dragging"); - onstop.apply(element, arguments); - } - dragging = false; - } - - $(element).bind("touchstart mousedown", start); - } - - function throttle(func, wait, debounce) { - var timeout; - return function () { - var context = this, args = arguments; - var throttler = function () { - timeout = null; - func.apply(context, args); - }; - if (debounce) clearTimeout(timeout); - if (debounce || !timeout) timeout = setTimeout(throttler, wait); - }; - } - - function log(){/* jshint -W021 */if(window.console){if(Function.prototype.bind)log=Function.prototype.bind.call(console.log,console);else log=function(){Function.prototype.apply.call(console.log,console,arguments);};log.apply(this,arguments);}} - - /** - * Define a jQuery plugin - */ - var dataID = "spectrum.id"; - $.fn.spectrum = function (opts, extra) { - - if (typeof opts == "string") { - - var returnValue = this; - var args = Array.prototype.slice.call( arguments, 1 ); - - this.each(function () { - var spect = spectrums[$(this).data(dataID)]; - if (spect) { - var method = spect[opts]; - if (!method) { - throw new Error( "Spectrum: no such method: '" + opts + "'" ); - } - - if (opts == "get") { - returnValue = spect.get(); - } - else if (opts == "container") { - returnValue = spect.container; - } - else if (opts == "option") { - returnValue = spect.option.apply(spect, args); - } - else if (opts == "destroy") { - spect.destroy(); - $(this).removeData(dataID); - } - else { - method.apply(spect, args); - } - } - }); - - return returnValue; - } - - // Initializing a new instance of spectrum - return this.spectrum("destroy").each(function () { - var options = $.extend({}, opts, $(this).data()); - var spect = spectrum(this, options); - $(this).data(dataID, spect.id); - }); - }; - - $.fn.spectrum.load = true; - $.fn.spectrum.loadOpts = {}; - $.fn.spectrum.draggable = draggable; - $.fn.spectrum.defaults = defaultOpts; - - $.spectrum = { }; - $.spectrum.localization = { }; - $.spectrum.palettes = { }; - - $.fn.spectrum.processNativeColorInputs = function () { - if (!inputTypeColorSupport) { - $("input[type=color]").spectrum({ - preferredFormat: "hex6" - }); - } - }; - - // TinyColor v0.9.17 - // https://github.com/bgrins/TinyColor - // 2013-08-10, Brian Grinstead, MIT License - - (function() { - - var trimLeft = /^[\s,#]+/, - trimRight = /\s+$/, - tinyCounter = 0, - math = Math, - mathRound = math.round, - mathMin = math.min, - mathMax = math.max, - mathRandom = math.random; - - function tinycolor (color, opts) { - - color = (color) ? color : ''; - opts = opts || { }; - - // If input is already a tinycolor, return itself - if (typeof color == "object" && color.hasOwnProperty("_tc_id")) { - return color; - } - - var rgb = inputToRGB(color); - var r = rgb.r, - g = rgb.g, - b = rgb.b, - a = rgb.a, - roundA = mathRound(100*a) / 100, - format = opts.format || rgb.format; - - // Don't let the range of [0,255] come back in [0,1]. - // Potentially lose a little bit of precision here, but will fix issues where - // .5 gets interpreted as half of the total, instead of half of 1 - // If it was supposed to be 128, this was already taken care of by `inputToRgb` - if (r < 1) { r = mathRound(r); } - if (g < 1) { g = mathRound(g); } - if (b < 1) { b = mathRound(b); } - - return { - ok: rgb.ok, - format: format, - _tc_id: tinyCounter++, - alpha: a, - getAlpha: function() { - return a; - }, - setAlpha: function(value) { - a = boundAlpha(value); - roundA = mathRound(100*a) / 100; - }, - toHsv: function() { - var hsv = rgbToHsv(r, g, b); - return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: a }; - }, - toHsvString: function() { - var hsv = rgbToHsv(r, g, b); - var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); - return (a == 1) ? - "hsv(" + h + ", " + s + "%, " + v + "%)" : - "hsva(" + h + ", " + s + "%, " + v + "%, "+ roundA + ")"; - }, - toHsl: function() { - var hsl = rgbToHsl(r, g, b); - return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: a }; - }, - toHslString: function() { - var hsl = rgbToHsl(r, g, b); - var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); - return (a == 1) ? - "hsl(" + h + ", " + s + "%, " + l + "%)" : - "hsla(" + h + ", " + s + "%, " + l + "%, "+ roundA + ")"; - }, - toHex: function(allow3Char) { - return rgbToHex(r, g, b, allow3Char); - }, - toHexString: function(allow3Char) { - return '#' + this.toHex(allow3Char); - }, - toHex8: function() { - return rgbaToHex(r, g, b, a); - }, - toHex8String: function() { - return '#' + this.toHex8(); - }, - toRgb: function() { - return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a }; - }, - toRgbString: function() { - return (a == 1) ? - "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" : - "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + roundA + ")"; - }, - toPercentageRgb: function() { - return { r: mathRound(bound01(r, 255) * 100) + "%", g: mathRound(bound01(g, 255) * 100) + "%", b: mathRound(bound01(b, 255) * 100) + "%", a: a }; - }, - toPercentageRgbString: function() { - return (a == 1) ? - "rgb(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%)" : - "rgba(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%, " + roundA + ")"; - }, - toName: function() { - if (a === 0) { - return "transparent"; - } - - return hexNames[rgbToHex(r, g, b, true)] || false; - }, - toFilter: function(secondColor) { - var hex8String = '#' + rgbaToHex(r, g, b, a); - var secondHex8String = hex8String; - var gradientType = opts && opts.gradientType ? "GradientType = 1, " : ""; - - if (secondColor) { - var s = tinycolor(secondColor); - secondHex8String = s.toHex8String(); - } - - return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; - }, - toString: function(format) { - var formatSet = !!format; - format = format || this.format; - - var formattedString = false; - var hasAlphaAndFormatNotSet = !formatSet && a < 1 && a > 0; - var formatWithAlpha = hasAlphaAndFormatNotSet && (format === "hex" || format === "hex6" || format === "hex3" || format === "name"); - - if (format === "rgb") { - formattedString = this.toRgbString(); - } - if (format === "prgb") { - formattedString = this.toPercentageRgbString(); - } - if (format === "hex" || format === "hex6") { - formattedString = this.toHexString(); - } - if (format === "hex3") { - formattedString = this.toHexString(true); - } - if (format === "hex8") { - formattedString = this.toHex8String(); - } - if (format === "name") { - formattedString = this.toName(); - } - if (format === "hsl") { - formattedString = this.toHslString(); - } - if (format === "hsv") { - formattedString = this.toHsvString(); - } - - if (formatWithAlpha) { - return this.toRgbString(); - } - - return formattedString || this.toHexString(); - } - }; - } - - // If input is an object, force 1 into "1.0" to handle ratios properly - // String input requires "1.0" as input, so 1 will be treated as 1 - tinycolor.fromRatio = function(color, opts) { - if (typeof color == "object") { - var newColor = {}; - for (var i in color) { - if (color.hasOwnProperty(i)) { - if (i === "a") { - newColor[i] = color[i]; - } - else { - newColor[i] = convertToPercentage(color[i]); - } - } - } - color = newColor; - } - - return tinycolor(color, opts); - }; - - // Given a string or object, convert that input to RGB - // Possible string inputs: - // - // "red" - // "#f00" or "f00" - // "#ff0000" or "ff0000" - // "#ff000000" or "ff000000" - // "rgb 255 0 0" or "rgb (255, 0, 0)" - // "rgb 1.0 0 0" or "rgb (1, 0, 0)" - // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" - // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" - // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" - // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" - // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" - // - function inputToRGB(color) { - - var rgb = { r: 0, g: 0, b: 0 }; - var a = 1; - var ok = false; - var format = false; - - if (typeof color == "string") { - color = stringInputToObject(color); - } - - if (typeof color == "object") { - if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { - rgb = rgbToRgb(color.r, color.g, color.b); - ok = true; - format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; - } - else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { - color.s = convertToPercentage(color.s); - color.v = convertToPercentage(color.v); - rgb = hsvToRgb(color.h, color.s, color.v); - ok = true; - format = "hsv"; - } - else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { - color.s = convertToPercentage(color.s); - color.l = convertToPercentage(color.l); - rgb = hslToRgb(color.h, color.s, color.l); - ok = true; - format = "hsl"; - } - - if (color.hasOwnProperty("a")) { - a = color.a; - } - } - - a = boundAlpha(a); - - return { - ok: ok, - format: color.format || format, - r: mathMin(255, mathMax(rgb.r, 0)), - g: mathMin(255, mathMax(rgb.g, 0)), - b: mathMin(255, mathMax(rgb.b, 0)), - a: a - }; - } - - - // Conversion Functions - // -------------------- - - // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: - // - - // `rgbToRgb` - // Handle bounds / percentage checking to conform to CSS color spec - // - // *Assumes:* r, g, b in [0, 255] or [0, 1] - // *Returns:* { r, g, b } in [0, 255] - function rgbToRgb(r, g, b){ - return { - r: bound01(r, 255) * 255, - g: bound01(g, 255) * 255, - b: bound01(b, 255) * 255 - }; - } - - // `rgbToHsl` - // Converts an RGB color value to HSL. - // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] - // *Returns:* { h, s, l } in [0,1] - function rgbToHsl(r, g, b) { - - r = bound01(r, 255); - g = bound01(g, 255); - b = bound01(b, 255); - - var max = mathMax(r, g, b), min = mathMin(r, g, b); - var h, s, l = (max + min) / 2; - - if(max == min) { - h = s = 0; // achromatic - } - else { - var d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch(max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - - h /= 6; - } - - return { h: h, s: s, l: l }; - } - - // `hslToRgb` - // Converts an HSL color value to RGB. - // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] - // *Returns:* { r, g, b } in the set [0, 255] - function hslToRgb(h, s, l) { - var r, g, b; - - h = bound01(h, 360); - s = bound01(s, 100); - l = bound01(l, 100); - - function hue2rgb(p, q, t) { - if(t < 0) t += 1; - if(t > 1) t -= 1; - if(t < 1/6) return p + (q - p) * 6 * t; - if(t < 1/2) return q; - if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; - return p; - } - - if(s === 0) { - r = g = b = l; // achromatic - } - else { - var q = l < 0.5 ? l * (1 + s) : l + s - l * s; - var p = 2 * l - q; - r = hue2rgb(p, q, h + 1/3); - g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1/3); - } - - return { r: r * 255, g: g * 255, b: b * 255 }; - } - - // `rgbToHsv` - // Converts an RGB color value to HSV - // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] - // *Returns:* { h, s, v } in [0,1] - function rgbToHsv(r, g, b) { - - r = bound01(r, 255); - g = bound01(g, 255); - b = bound01(b, 255); - - var max = mathMax(r, g, b), min = mathMin(r, g, b); - var h, s, v = max; - - var d = max - min; - s = max === 0 ? 0 : d / max; - - if(max == min) { - h = 0; // achromatic - } - else { - switch(max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - h /= 6; - } - return { h: h, s: s, v: v }; - } - - // `hsvToRgb` - // Converts an HSV color value to RGB. - // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] - // *Returns:* { r, g, b } in the set [0, 255] - function hsvToRgb(h, s, v) { - - h = bound01(h, 360) * 6; - s = bound01(s, 100); - v = bound01(v, 100); - - var i = math.floor(h), - f = h - i, - p = v * (1 - s), - q = v * (1 - f * s), - t = v * (1 - (1 - f) * s), - mod = i % 6, - r = [v, q, p, p, t, v][mod], - g = [t, v, v, q, p, p][mod], - b = [p, p, t, v, v, q][mod]; - - return { r: r * 255, g: g * 255, b: b * 255 }; - } - - // `rgbToHex` - // Converts an RGB color to hex - // Assumes r, g, and b are contained in the set [0, 255] - // Returns a 3 or 6 character hex - function rgbToHex(r, g, b, allow3Char) { - - var hex = [ - pad2(mathRound(r).toString(16)), - pad2(mathRound(g).toString(16)), - pad2(mathRound(b).toString(16)) - ]; - - // Return a 3 character hex if possible - if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { - return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); - } - - return hex.join(""); - } - // `rgbaToHex` - // Converts an RGBA color plus alpha transparency to hex - // Assumes r, g, b and a are contained in the set [0, 255] - // Returns an 8 character hex - function rgbaToHex(r, g, b, a) { - - var hex = [ - pad2(convertDecimalToHex(a)), - pad2(mathRound(r).toString(16)), - pad2(mathRound(g).toString(16)), - pad2(mathRound(b).toString(16)) - ]; - - return hex.join(""); - } - - // `equals` - // Can be called with any tinycolor input - tinycolor.equals = function (color1, color2) { - if (!color1 || !color2) { return false; } - return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); - }; - tinycolor.random = function() { - return tinycolor.fromRatio({ - r: mathRandom(), - g: mathRandom(), - b: mathRandom() - }); - }; - - - // Modification Functions - // ---------------------- - // Thanks to less.js for some of the basics here - // - - tinycolor.desaturate = function (color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.s -= amount / 100; - hsl.s = clamp01(hsl.s); - return tinycolor(hsl); - }; - tinycolor.saturate = function (color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.s += amount / 100; - hsl.s = clamp01(hsl.s); - return tinycolor(hsl); - }; - tinycolor.greyscale = function(color) { - return tinycolor.desaturate(color, 100); - }; - tinycolor.lighten = function(color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.l += amount / 100; - hsl.l = clamp01(hsl.l); - return tinycolor(hsl); - }; - tinycolor.darken = function (color, amount) { - amount = (amount === 0) ? 0 : (amount || 10); - var hsl = tinycolor(color).toHsl(); - hsl.l -= amount / 100; - hsl.l = clamp01(hsl.l); - return tinycolor(hsl); - }; - tinycolor.complement = function(color) { - var hsl = tinycolor(color).toHsl(); - hsl.h = (hsl.h + 180) % 360; - return tinycolor(hsl); - }; - - - // Combination Functions - // --------------------- - // Thanks to jQuery xColor for some of the ideas behind these - // - - tinycolor.triad = function(color) { - var hsl = tinycolor(color).toHsl(); - var h = hsl.h; - return [ - tinycolor(color), - tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), - tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) - ]; - }; - tinycolor.tetrad = function(color) { - var hsl = tinycolor(color).toHsl(); - var h = hsl.h; - return [ - tinycolor(color), - tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), - tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), - tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) - ]; - }; - tinycolor.splitcomplement = function(color) { - var hsl = tinycolor(color).toHsl(); - var h = hsl.h; - return [ - tinycolor(color), - tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), - tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) - ]; - }; - tinycolor.analogous = function(color, results, slices) { - results = results || 6; - slices = slices || 30; - - var hsl = tinycolor(color).toHsl(); - var part = 360 / slices; - var ret = [tinycolor(color)]; - - for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { - hsl.h = (hsl.h + part) % 360; - ret.push(tinycolor(hsl)); - } - return ret; - }; - tinycolor.monochromatic = function(color, results) { - results = results || 6; - var hsv = tinycolor(color).toHsv(); - var h = hsv.h, s = hsv.s, v = hsv.v; - var ret = []; - var modification = 1 / results; - - while (results--) { - ret.push(tinycolor({ h: h, s: s, v: v})); - v = (v + modification) % 1; - } - - return ret; - }; - - - // Readability Functions - // --------------------- - // - - // `readability` - // Analyze the 2 colors and returns an object with the following properties: - // `brightness`: difference in brightness between the two colors - // `color`: difference in color/hue between the two colors - tinycolor.readability = function(color1, color2) { - var a = tinycolor(color1).toRgb(); - var b = tinycolor(color2).toRgb(); - var brightnessA = (a.r * 299 + a.g * 587 + a.b * 114) / 1000; - var brightnessB = (b.r * 299 + b.g * 587 + b.b * 114) / 1000; - var colorDiff = ( - Math.max(a.r, b.r) - Math.min(a.r, b.r) + - Math.max(a.g, b.g) - Math.min(a.g, b.g) + - Math.max(a.b, b.b) - Math.min(a.b, b.b) - ); - - return { - brightness: Math.abs(brightnessA - brightnessB), - color: colorDiff - }; - }; - - // `readable` - // http://www.w3.org/TR/AERT#color-contrast - // Ensure that foreground and background color combinations provide sufficient contrast. - // *Example* - // tinycolor.readable("#000", "#111") => false - tinycolor.readable = function(color1, color2) { - var readability = tinycolor.readability(color1, color2); - return readability.brightness > 125 && readability.color > 500; - }; - - // `mostReadable` - // Given a base color and a list of possible foreground or background - // colors for that base, returns the most readable color. - // *Example* - // tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000" - tinycolor.mostReadable = function(baseColor, colorList) { - var bestColor = null; - var bestScore = 0; - var bestIsReadable = false; - for (var i=0; i < colorList.length; i++) { - - // We normalize both around the "acceptable" breaking point, - // but rank brightness constrast higher than hue. - - var readability = tinycolor.readability(baseColor, colorList[i]); - var readable = readability.brightness > 125 && readability.color > 500; - var score = 3 * (readability.brightness / 125) + (readability.color / 500); - - if ((readable && ! bestIsReadable) || - (readable && bestIsReadable && score > bestScore) || - ((! readable) && (! bestIsReadable) && score > bestScore)) { - bestIsReadable = readable; - bestScore = score; - bestColor = tinycolor(colorList[i]); - } - } - return bestColor; - }; - - - // Big List of Colors - // ------------------ - // - var names = tinycolor.names = { - aliceblue: "f0f8ff", - antiquewhite: "faebd7", - aqua: "0ff", - aquamarine: "7fffd4", - azure: "f0ffff", - beige: "f5f5dc", - bisque: "ffe4c4", - black: "000", - blanchedalmond: "ffebcd", - blue: "00f", - blueviolet: "8a2be2", - brown: "a52a2a", - burlywood: "deb887", - burntsienna: "ea7e5d", - cadetblue: "5f9ea0", - chartreuse: "7fff00", - chocolate: "d2691e", - coral: "ff7f50", - cornflowerblue: "6495ed", - cornsilk: "fff8dc", - crimson: "dc143c", - cyan: "0ff", - darkblue: "00008b", - darkcyan: "008b8b", - darkgoldenrod: "b8860b", - darkgray: "a9a9a9", - darkgreen: "006400", - darkgrey: "a9a9a9", - darkkhaki: "bdb76b", - darkmagenta: "8b008b", - darkolivegreen: "556b2f", - darkorange: "ff8c00", - darkorchid: "9932cc", - darkred: "8b0000", - darksalmon: "e9967a", - darkseagreen: "8fbc8f", - darkslateblue: "483d8b", - darkslategray: "2f4f4f", - darkslategrey: "2f4f4f", - darkturquoise: "00ced1", - darkviolet: "9400d3", - deeppink: "ff1493", - deepskyblue: "00bfff", - dimgray: "696969", - dimgrey: "696969", - dodgerblue: "1e90ff", - firebrick: "b22222", - floralwhite: "fffaf0", - forestgreen: "228b22", - fuchsia: "f0f", - gainsboro: "dcdcdc", - ghostwhite: "f8f8ff", - gold: "ffd700", - goldenrod: "daa520", - gray: "808080", - green: "008000", - greenyellow: "adff2f", - grey: "808080", - honeydew: "f0fff0", - hotpink: "ff69b4", - indianred: "cd5c5c", - indigo: "4b0082", - ivory: "fffff0", - khaki: "f0e68c", - lavender: "e6e6fa", - lavenderblush: "fff0f5", - lawngreen: "7cfc00", - lemonchiffon: "fffacd", - lightblue: "add8e6", - lightcoral: "f08080", - lightcyan: "e0ffff", - lightgoldenrodyellow: "fafad2", - lightgray: "d3d3d3", - lightgreen: "90ee90", - lightgrey: "d3d3d3", - lightpink: "ffb6c1", - lightsalmon: "ffa07a", - lightseagreen: "20b2aa", - lightskyblue: "87cefa", - lightslategray: "789", - lightslategrey: "789", - lightsteelblue: "b0c4de", - lightyellow: "ffffe0", - lime: "0f0", - limegreen: "32cd32", - linen: "faf0e6", - magenta: "f0f", - maroon: "800000", - mediumaquamarine: "66cdaa", - mediumblue: "0000cd", - mediumorchid: "ba55d3", - mediumpurple: "9370db", - mediumseagreen: "3cb371", - mediumslateblue: "7b68ee", - mediumspringgreen: "00fa9a", - mediumturquoise: "48d1cc", - mediumvioletred: "c71585", - midnightblue: "191970", - mintcream: "f5fffa", - mistyrose: "ffe4e1", - moccasin: "ffe4b5", - navajowhite: "ffdead", - navy: "000080", - oldlace: "fdf5e6", - olive: "808000", - olivedrab: "6b8e23", - orange: "ffa500", - orangered: "ff4500", - orchid: "da70d6", - palegoldenrod: "eee8aa", - palegreen: "98fb98", - paleturquoise: "afeeee", - palevioletred: "db7093", - papayawhip: "ffefd5", - peachpuff: "ffdab9", - peru: "cd853f", - pink: "ffc0cb", - plum: "dda0dd", - powderblue: "b0e0e6", - purple: "800080", - red: "f00", - rosybrown: "bc8f8f", - royalblue: "4169e1", - saddlebrown: "8b4513", - salmon: "fa8072", - sandybrown: "f4a460", - seagreen: "2e8b57", - seashell: "fff5ee", - sienna: "a0522d", - silver: "c0c0c0", - skyblue: "87ceeb", - slateblue: "6a5acd", - slategray: "708090", - slategrey: "708090", - snow: "fffafa", - springgreen: "00ff7f", - steelblue: "4682b4", - tan: "d2b48c", - teal: "008080", - thistle: "d8bfd8", - tomato: "ff6347", - turquoise: "40e0d0", - violet: "ee82ee", - wheat: "f5deb3", - white: "fff", - whitesmoke: "f5f5f5", - yellow: "ff0", - yellowgreen: "9acd32" - }; - - // Make it easy to access colors via `hexNames[hex]` - var hexNames = tinycolor.hexNames = flip(names); - - - // Utilities - // --------- - - // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` - function flip(o) { - var flipped = { }; - for (var i in o) { - if (o.hasOwnProperty(i)) { - flipped[o[i]] = i; - } - } - return flipped; - } - - // Return a valid alpha value [0,1] with all invalid values being set to 1 - function boundAlpha(a) { - a = parseFloat(a); - - if (isNaN(a) || a < 0 || a > 1) { - a = 1; - } - - return a; - } - - // Take input from [0, n] and return it as [0, 1] - function bound01(n, max) { - if (isOnePointZero(n)) { n = "100%"; } - - var processPercent = isPercentage(n); - n = mathMin(max, mathMax(0, parseFloat(n))); - - // Automatically convert percentage into number - if (processPercent) { - n = parseInt(n * max, 10) / 100; - } - - // Handle floating point rounding errors - if ((math.abs(n - max) < 0.000001)) { - return 1; - } - - // Convert into [0, 1] range if it isn't already - return (n % max) / parseFloat(max); - } - - // Force a number between 0 and 1 - function clamp01(val) { - return mathMin(1, mathMax(0, val)); - } - - // Parse a base-16 hex value into a base-10 integer - function parseIntFromHex(val) { - return parseInt(val, 16); - } - - // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 - // - function isOnePointZero(n) { - return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; - } - - // Check to see if string passed in is a percentage - function isPercentage(n) { - return typeof n === "string" && n.indexOf('%') != -1; - } - - // Force a hex value to have 2 characters - function pad2(c) { - return c.length == 1 ? '0' + c : '' + c; - } - - // Replace a decimal with it's percentage value - function convertToPercentage(n) { - if (n <= 1) { - n = (n * 100) + "%"; - } - - return n; - } - - // Converts a decimal to a hex value - function convertDecimalToHex(d) { - return Math.round(parseFloat(d) * 255).toString(16); - } - // Converts a hex value to a decimal - function convertHexToDecimal(h) { - return (parseIntFromHex(h) / 255); - } - - var matchers = (function() { - - // - var CSS_INTEGER = "[-\\+]?\\d+%?"; - - // - var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; - - // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. - var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; - - // Actual matching. - // Parentheses and commas are optional, but not required. - // Whitespace can take the place of commas or opening paren - var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; - var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; - - return { - rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), - rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), - hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), - hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), - hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), - hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, - hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, - hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ - }; - })(); - - // `stringInputToObject` - // Permissive string parsing. Take in a number of formats, and output an object - // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` - function stringInputToObject(color) { - - color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); - var named = false; - if (names[color]) { - color = names[color]; - named = true; - } - else if (color == 'transparent') { - return { r: 0, g: 0, b: 0, a: 0, format: "name" }; - } - - // Try to match string input using regular expressions. - // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] - // Just return an object and let the conversion functions handle that. - // This way the result will be the same whether the tinycolor is initialized with string or object. - var match; - if ((match = matchers.rgb.exec(color))) { - return { r: match[1], g: match[2], b: match[3] }; - } - if ((match = matchers.rgba.exec(color))) { - return { r: match[1], g: match[2], b: match[3], a: match[4] }; - } - if ((match = matchers.hsl.exec(color))) { - return { h: match[1], s: match[2], l: match[3] }; - } - if ((match = matchers.hsla.exec(color))) { - return { h: match[1], s: match[2], l: match[3], a: match[4] }; - } - if ((match = matchers.hsv.exec(color))) { - return { h: match[1], s: match[2], v: match[3] }; - } - if ((match = matchers.hex8.exec(color))) { - return { - a: convertHexToDecimal(match[1]), - r: parseIntFromHex(match[2]), - g: parseIntFromHex(match[3]), - b: parseIntFromHex(match[4]), - format: named ? "name" : "hex8" - }; - } - if ((match = matchers.hex6.exec(color))) { - return { - r: parseIntFromHex(match[1]), - g: parseIntFromHex(match[2]), - b: parseIntFromHex(match[3]), - format: named ? "name" : "hex" - }; - } - if ((match = matchers.hex3.exec(color))) { - return { - r: parseIntFromHex(match[1] + '' + match[1]), - g: parseIntFromHex(match[2] + '' + match[2]), - b: parseIntFromHex(match[3] + '' + match[3]), - format: named ? "name" : "hex" - }; - } - - return false; - } - - // Expose tinycolor to window, does not need to run in non-browser context. - window.tinycolor = tinycolor; - - })(); - - - $(function () { - if ($.fn.spectrum.load) { - $.fn.spectrum.processNativeColorInputs(); - } - }); - -})(window, jQuery); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.js deleted file mode 100644 index 5971d883..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.js +++ /dev/null @@ -1,5014 +0,0 @@ -/** - * angular-strap - * @version v2.1.6 - 2015-01-11 - * @link http://mgcrea.github.io/angular-strap - * @author Olivier Louvignes (olivier@mg-crea.com) - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -(function(window, document, undefined) { -'use strict'; -// Source: module.js -angular.module('mgcrea.ngStrap', [ - 'mgcrea.ngStrap.modal', - 'mgcrea.ngStrap.aside', - 'mgcrea.ngStrap.alert', - 'mgcrea.ngStrap.button', - 'mgcrea.ngStrap.select', - 'mgcrea.ngStrap.datepicker', - 'mgcrea.ngStrap.timepicker', - 'mgcrea.ngStrap.navbar', - 'mgcrea.ngStrap.tooltip', - 'mgcrea.ngStrap.popover', - 'mgcrea.ngStrap.dropdown', - 'mgcrea.ngStrap.typeahead', - 'mgcrea.ngStrap.scrollspy', - 'mgcrea.ngStrap.affix', - 'mgcrea.ngStrap.tab', - 'mgcrea.ngStrap.collapse' -]); - -// Source: affix.js -angular.module('mgcrea.ngStrap.affix', ['mgcrea.ngStrap.helpers.dimensions', 'mgcrea.ngStrap.helpers.debounce']) - - .provider('$affix', function() { - - var defaults = this.defaults = { - offsetTop: 'auto' - }; - - this.$get = ["$window", "debounce", "dimensions", function($window, debounce, dimensions) { - - var bodyEl = angular.element($window.document.body); - var windowEl = angular.element($window); - - function AffixFactory(element, config) { - - var $affix = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - var targetEl = options.target; - - // Initial private vars - var reset = 'affix affix-top affix-bottom', - setWidth = false, - initialAffixTop = 0, - initialOffsetTop = 0, - offsetTop = 0, - offsetBottom = 0, - affixed = null, - unpin = null; - - var parent = element.parent(); - // Options: custom parent - if (options.offsetParent) { - if (options.offsetParent.match(/^\d+$/)) { - for (var i = 0; i < (options.offsetParent * 1) - 1; i++) { - parent = parent.parent(); - } - } - else { - parent = angular.element(options.offsetParent); - } - } - - $affix.init = function() { - - this.$parseOffsets(); - initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop; - setWidth = !element[0].style.width; - - // Bind events - targetEl.on('scroll', this.checkPosition); - targetEl.on('click', this.checkPositionWithEventLoop); - windowEl.on('resize', this.$debouncedOnResize); - - // Both of these checkPosition() calls are necessary for the case where - // the user hits refresh after scrolling to the bottom of the page. - this.checkPosition(); - this.checkPositionWithEventLoop(); - - }; - - $affix.destroy = function() { - - // Unbind events - targetEl.off('scroll', this.checkPosition); - targetEl.off('click', this.checkPositionWithEventLoop); - windowEl.off('resize', this.$debouncedOnResize); - - }; - - $affix.checkPositionWithEventLoop = function() { - - // IE 9 throws an error if we use 'this' instead of '$affix' - // in this setTimeout call - setTimeout($affix.checkPosition, 1); - - }; - - $affix.checkPosition = function() { - // if (!this.$element.is(':visible')) return - - var scrollTop = getScrollTop(); - var position = dimensions.offset(element[0]); - var elementHeight = dimensions.height(element[0]); - - // Get required affix class according to position - var affix = getRequiredAffixClass(unpin, position, elementHeight); - - // Did affix status changed this last check? - if(affixed === affix) return; - affixed = affix; - - // Add proper affix class - element.removeClass(reset).addClass('affix' + ((affix !== 'middle') ? '-' + affix : '')); - - if(affix === 'top') { - unpin = null; - element.css('position', (options.offsetParent) ? '' : 'relative'); - if(setWidth) { - element.css('width', ''); - } - element.css('top', ''); - } else if(affix === 'bottom') { - if (options.offsetUnpin) { - unpin = -(options.offsetUnpin * 1); - } - else { - // Calculate unpin threshold when affixed to bottom. - // Hopefully the browser scrolls pixel by pixel. - unpin = position.top - scrollTop; - } - if(setWidth) { - element.css('width', ''); - } - element.css('position', (options.offsetParent) ? '' : 'relative'); - element.css('top', (options.offsetParent) ? '' : ((bodyEl[0].offsetHeight - offsetBottom - elementHeight - initialOffsetTop) + 'px')); - } else { // affix === 'middle' - unpin = null; - if(setWidth) { - element.css('width', element[0].offsetWidth + 'px'); - } - element.css('position', 'fixed'); - element.css('top', initialAffixTop + 'px'); - } - - }; - - $affix.$onResize = function() { - $affix.$parseOffsets(); - $affix.checkPosition(); - }; - $affix.$debouncedOnResize = debounce($affix.$onResize, 50); - - $affix.$parseOffsets = function() { - var initialPosition = element.css('position'); - // Reset position to calculate correct offsetTop - element.css('position', (options.offsetParent) ? '' : 'relative'); - - if(options.offsetTop) { - if(options.offsetTop === 'auto') { - options.offsetTop = '+0'; - } - if(options.offsetTop.match(/^[-+]\d+$/)) { - initialAffixTop = - options.offsetTop * 1; - if(options.offsetParent) { - offsetTop = dimensions.offset(parent[0]).top + (options.offsetTop * 1); - } - else { - offsetTop = dimensions.offset(element[0]).top - dimensions.css(element[0], 'marginTop', true) + (options.offsetTop * 1); - } - } - else { - offsetTop = options.offsetTop * 1; - } - } - - if(options.offsetBottom) { - if(options.offsetParent && options.offsetBottom.match(/^[-+]\d+$/)) { - // add 1 pixel due to rounding problems... - offsetBottom = getScrollHeight() - (dimensions.offset(parent[0]).top + dimensions.height(parent[0])) + (options.offsetBottom * 1) + 1; - } - else { - offsetBottom = options.offsetBottom * 1; - } - } - - // Bring back the element's position after calculations - element.css('position', initialPosition); - }; - - // Private methods - - function getRequiredAffixClass(unpin, position, elementHeight) { - - var scrollTop = getScrollTop(); - var scrollHeight = getScrollHeight(); - - if(scrollTop <= offsetTop) { - return 'top'; - } else if(unpin !== null && (scrollTop + unpin <= position.top)) { - return 'middle'; - } else if(offsetBottom !== null && (position.top + elementHeight + initialAffixTop >= scrollHeight - offsetBottom)) { - return 'bottom'; - } else { - return 'middle'; - } - - } - - function getScrollTop() { - return targetEl[0] === $window ? $window.pageYOffset : targetEl[0].scrollTop; - } - - function getScrollHeight() { - return targetEl[0] === $window ? $window.document.body.scrollHeight : targetEl[0].scrollHeight; - } - - $affix.init(); - return $affix; - - } - - return AffixFactory; - - }]; - - }) - - .directive('bsAffix', ["$affix", "$window", function($affix, $window) { - - return { - restrict: 'EAC', - require: '^?bsAffixTarget', - link: function postLink(scope, element, attr, affixTarget) { - - var options = {scope: scope, offsetTop: 'auto', target: affixTarget ? affixTarget.$element : angular.element($window)}; - angular.forEach(['offsetTop', 'offsetBottom', 'offsetParent', 'offsetUnpin'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - var affix = $affix(element, options); - scope.$on('$destroy', function() { - affix && affix.destroy(); - options = null; - affix = null; - }); - - } - }; - - }]) - - .directive('bsAffixTarget', function() { - return { - controller: ["$element", function($element) { - this.$element = $element; - }] - }; - }); - -// Source: alert.js -// @BUG: following snippet won't compile correctly -// @TODO: submit issue to core -// ' ' + - -angular.module('mgcrea.ngStrap.alert', ['mgcrea.ngStrap.modal']) - - .provider('$alert', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - prefixClass: 'alert', - prefixEvent: 'alert', - placement: null, - template: 'alert/alert.tpl.html', - container: false, - element: null, - backdrop: false, - keyboard: true, - show: true, - // Specific options - duration: false, - type: false, - dismissable: true - }; - - this.$get = ["$modal", "$timeout", function($modal, $timeout) { - - function AlertFactory(config) { - - var $alert = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - - $alert = $modal(options); - - // Support scope as string options [/*title, content, */ type, dismissable] - $alert.$scope.dismissable = !!options.dismissable; - if(options.type) { - $alert.$scope.type = options.type; - } - - // Support auto-close duration - var show = $alert.show; - if(options.duration) { - $alert.show = function() { - show(); - $timeout(function() { - $alert.hide(); - }, options.duration * 1000); - }; - } - - return $alert; - - } - - return AlertFactory; - - }]; - - }) - - .directive('bsAlert', ["$window", "$sce", "$alert", function($window, $sce, $alert) { - - var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout; - - return { - restrict: 'EAC', - scope: true, - link: function postLink(scope, element, attr, transclusion) { - - // Directive options - var options = {scope: scope, element: element, show: false}; - angular.forEach(['template', 'placement', 'keyboard', 'html', 'container', 'animation', 'duration', 'dismissable'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Support scope as data-attrs - angular.forEach(['title', 'content', 'type'], function(key) { - attr[key] && attr.$observe(key, function(newValue, oldValue) { - scope[key] = $sce.trustAsHtml(newValue); - }); - }); - - // Support scope as an object - attr.bsAlert && scope.$watch(attr.bsAlert, function(newValue, oldValue) { - if(angular.isObject(newValue)) { - angular.extend(scope, newValue); - } else { - scope.content = newValue; - } - }, true); - - // Initialize alert - var alert = $alert(options); - - // Trigger - element.on(attr.trigger || 'click', alert.toggle); - - // Garbage collection - scope.$on('$destroy', function() { - if (alert) alert.destroy(); - options = null; - alert = null; - }); - - } - }; - - }]); - -// Source: aside.js -angular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal']) - - .provider('$aside', function() { - - var defaults = this.defaults = { - animation: 'am-fade-and-slide-right', - prefixClass: 'aside', - prefixEvent: 'aside', - placement: 'right', - template: 'aside/aside.tpl.html', - contentTemplate: false, - container: false, - element: null, - backdrop: true, - keyboard: true, - html: false, - show: true - }; - - this.$get = ["$modal", function($modal) { - - function AsideFactory(config) { - - var $aside = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - - $aside = $modal(options); - - return $aside; - - } - - return AsideFactory; - - }]; - - }) - - .directive('bsAside', ["$window", "$sce", "$aside", function($window, $sce, $aside) { - - var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout; - - return { - restrict: 'EAC', - scope: true, - link: function postLink(scope, element, attr, transclusion) { - // Directive options - var options = {scope: scope, element: element, show: false}; - angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Support scope as data-attrs - angular.forEach(['title', 'content'], function(key) { - attr[key] && attr.$observe(key, function(newValue, oldValue) { - scope[key] = $sce.trustAsHtml(newValue); - }); - }); - - // Support scope as an object - attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) { - if(angular.isObject(newValue)) { - angular.extend(scope, newValue); - } else { - scope.content = newValue; - } - }, true); - - // Initialize aside - var aside = $aside(options); - - // Trigger - element.on(attr.trigger || 'click', aside.toggle); - - // Garbage collection - scope.$on('$destroy', function() { - if (aside) aside.destroy(); - options = null; - aside = null; - }); - - } - }; - - }]); - -// Source: button.js -angular.module('mgcrea.ngStrap.button', []) - - .provider('$button', function() { - - var defaults = this.defaults = { - activeClass:'active', - toggleEvent:'click' - }; - - this.$get = function() { - return {defaults: defaults}; - }; - - }) - - .directive('bsCheckboxGroup', function() { - - return { - restrict: 'A', - require: 'ngModel', - compile: function postLink(element, attr) { - element.attr('data-toggle', 'buttons'); - element.removeAttr('ng-model'); - var children = element[0].querySelectorAll('input[type="checkbox"]'); - angular.forEach(children, function(child) { - var childEl = angular.element(child); - childEl.attr('bs-checkbox', ''); - childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value')); - }); - } - - }; - - }) - - .directive('bsCheckbox', ["$button", "$$rAF", function($button, $$rAF) { - - var defaults = $button.defaults; - var constantValueRegExp = /^(true|false|\d+)$/; - - return { - restrict: 'A', - require: 'ngModel', - link: function postLink(scope, element, attr, controller) { - - var options = defaults; - - // Support label > input[type="checkbox"] - var isInput = element[0].nodeName === 'INPUT'; - var activeElement = isInput ? element.parent() : element; - - var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true; - if(constantValueRegExp.test(attr.trueValue)) { - trueValue = scope.$eval(attr.trueValue); - } - var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false; - if(constantValueRegExp.test(attr.falseValue)) { - falseValue = scope.$eval(attr.falseValue); - } - - // Parse exotic values - var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean'; - if(hasExoticValues) { - controller.$parsers.push(function(viewValue) { - // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue); - return viewValue ? trueValue : falseValue; - }); - // modelValue -> $formatters -> viewValue - controller.$formatters.push(function(modelValue) { - // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue); - return angular.equals(modelValue, trueValue); - }); - // Fix rendering for exotic values - scope.$watch(attr.ngModel, function(newValue, oldValue) { - controller.$render(); - }); - } - - // model -> view - controller.$render = function () { - // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue); - var isActive = angular.equals(controller.$modelValue, trueValue); - $$rAF(function() { - if(isInput) element[0].checked = isActive; - activeElement.toggleClass(options.activeClass, isActive); - }); - }; - - // view -> model - element.bind(options.toggleEvent, function() { - scope.$apply(function () { - // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue); - if(!isInput) { - controller.$setViewValue(!activeElement.hasClass('active')); - } - if(!hasExoticValues) { - controller.$render(); - } - }); - }); - - } - - }; - - }]) - - .directive('bsRadioGroup', function() { - - return { - restrict: 'A', - require: 'ngModel', - compile: function postLink(element, attr) { - element.attr('data-toggle', 'buttons'); - element.removeAttr('ng-model'); - var children = element[0].querySelectorAll('input[type="radio"]'); - angular.forEach(children, function(child) { - angular.element(child).attr('bs-radio', ''); - angular.element(child).attr('ng-model', attr.ngModel); - }); - } - - }; - - }) - - .directive('bsRadio', ["$button", "$$rAF", function($button, $$rAF) { - - var defaults = $button.defaults; - var constantValueRegExp = /^(true|false|\d+)$/; - - return { - restrict: 'A', - require: 'ngModel', - link: function postLink(scope, element, attr, controller) { - - var options = defaults; - - // Support `label > input[type="radio"]` markup - var isInput = element[0].nodeName === 'INPUT'; - var activeElement = isInput ? element.parent() : element; - - var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value; - - // model -> view - controller.$render = function () { - // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue); - var isActive = angular.equals(controller.$modelValue, value); - $$rAF(function() { - if(isInput) element[0].checked = isActive; - activeElement.toggleClass(options.activeClass, isActive); - }); - }; - - // view -> model - element.bind(options.toggleEvent, function() { - scope.$apply(function () { - // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue); - controller.$setViewValue(value); - controller.$render(); - }); - }); - - } - - }; - - }]); - -// Source: collapse.js -angular.module('mgcrea.ngStrap.collapse', []) - - .provider('$collapse', function() { - - var defaults = this.defaults = { - animation: 'am-collapse', - disallowToggle: false, - activeClass: 'in', - startCollapsed: false, - allowMultiple: false - }; - - var controller = this.controller = function($scope, $element, $attrs) { - var self = this; - - // Attributes options - self.$options = angular.copy(defaults); - angular.forEach(['animation', 'disallowToggle', 'activeClass', 'startCollapsed', 'allowMultiple'], function (key) { - if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key]; - }); - - self.$toggles = []; - self.$targets = []; - - self.$viewChangeListeners = []; - - self.$registerToggle = function(element) { - self.$toggles.push(element); - }; - self.$registerTarget = function(element) { - self.$targets.push(element); - }; - - self.$unregisterToggle = function(element) { - var index = self.$toggles.indexOf(element); - // remove toggle from $toggles array - self.$toggles.splice(index, 1); - }; - self.$unregisterTarget = function(element) { - var index = self.$targets.indexOf(element); - - // remove element from $targets array - self.$targets.splice(index, 1); - - if (self.$options.allowMultiple) { - // remove target index from $active array values - deactivateItem(element); - } - - // fix active item indexes - fixActiveItemIndexes(index); - - self.$viewChangeListeners.forEach(function(fn) { - fn(); - }); - }; - - // use array to store all the currently open panels - self.$targets.$active = !self.$options.startCollapsed ? [0] : []; - self.$setActive = $scope.$setActive = function(value) { - if(angular.isArray(value)) { - self.$targets.$active = angular.copy(value); - } - else if(!self.$options.disallowToggle) { - // toogle element active status - isActive(value) ? deactivateItem(value) : activateItem(value); - } else { - activateItem(value); - } - - self.$viewChangeListeners.forEach(function(fn) { - fn(); - }); - }; - - self.$activeIndexes = function() { - return self.$options.allowMultiple ? self.$targets.$active : - self.$targets.$active.length === 1 ? self.$targets.$active[0] : -1; - }; - - function fixActiveItemIndexes(index) { - // item with index was removed, so we - // need to adjust other items index values - var activeIndexes = self.$targets.$active; - for(var i = 0; i < activeIndexes.length; i++) { - if (index < activeIndexes[i]) { - activeIndexes[i] = activeIndexes[i] - 1; - } - - // the last item is active, so we need to - // adjust its index - if (activeIndexes[i] === self.$targets.length) { - activeIndexes[i] = self.$targets.length - 1; - } - } - } - - function isActive(value) { - var activeItems = self.$targets.$active; - return activeItems.indexOf(value) === -1 ? false : true; - } - - function deactivateItem(value) { - var index = self.$targets.$active.indexOf(value); - if (index !== -1) { - self.$targets.$active.splice(index, 1); - } - } - - function activateItem(value) { - if (!self.$options.allowMultiple) { - // remove current selected item - self.$targets.$active.splice(0, 1); - } - - if (self.$targets.$active.indexOf(value) === -1) { - self.$targets.$active.push(value); - } - } - - }; - - this.$get = function() { - var $collapse = {}; - $collapse.defaults = defaults; - $collapse.controller = controller; - return $collapse; - }; - - }) - - .directive('bsCollapse', ["$window", "$animate", "$collapse", function($window, $animate, $collapse) { - - var defaults = $collapse.defaults; - - return { - require: ['?ngModel', 'bsCollapse'], - controller: ['$scope', '$element', '$attrs', $collapse.controller], - link: function postLink(scope, element, attrs, controllers) { - - var ngModelCtrl = controllers[0]; - var bsCollapseCtrl = controllers[1]; - - if(ngModelCtrl) { - - // Update the modelValue following - bsCollapseCtrl.$viewChangeListeners.push(function() { - ngModelCtrl.$setViewValue(bsCollapseCtrl.$activeIndexes()); - }); - - // modelValue -> $formatters -> viewValue - ngModelCtrl.$formatters.push(function(modelValue) { - // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue); - if (angular.isArray(modelValue)) { - // model value is an array, so just replace - // the active items directly - bsCollapseCtrl.$setActive(modelValue); - } - else { - var activeIndexes = bsCollapseCtrl.$activeIndexes(); - - if (angular.isArray(activeIndexes)) { - // we have an array of selected indexes - if (activeIndexes.indexOf(modelValue * 1) === -1) { - // item with modelValue index is not active - bsCollapseCtrl.$setActive(modelValue * 1); - } - } - else if (activeIndexes !== modelValue * 1) { - bsCollapseCtrl.$setActive(modelValue * 1); - } - } - return modelValue; - }); - - } - - } - }; - - }]) - - .directive('bsCollapseToggle', function() { - - return { - require: ['^?ngModel', '^bsCollapse'], - link: function postLink(scope, element, attrs, controllers) { - - var ngModelCtrl = controllers[0]; - var bsCollapseCtrl = controllers[1]; - - // Add base attr - element.attr('data-toggle', 'collapse'); - - // Push pane to parent bsCollapse controller - bsCollapseCtrl.$registerToggle(element); - - // remove toggle from collapse controller when toggle is destroyed - scope.$on('$destroy', function() { - bsCollapseCtrl.$unregisterToggle(element); - }); - - element.on('click', function() { - var index = attrs.bsCollapseToggle || bsCollapseCtrl.$toggles.indexOf(element); - bsCollapseCtrl.$setActive(index * 1); - scope.$apply(); - }); - - } - }; - - }) - - .directive('bsCollapseTarget', ["$animate", function($animate) { - - return { - require: ['^?ngModel', '^bsCollapse'], - // scope: true, - link: function postLink(scope, element, attrs, controllers) { - - var ngModelCtrl = controllers[0]; - var bsCollapseCtrl = controllers[1]; - - // Add base class - element.addClass('collapse'); - - // Add animation class - if(bsCollapseCtrl.$options.animation) { - element.addClass(bsCollapseCtrl.$options.animation); - } - - // Push pane to parent bsCollapse controller - bsCollapseCtrl.$registerTarget(element); - - // remove pane target from collapse controller when target is destroyed - scope.$on('$destroy', function() { - bsCollapseCtrl.$unregisterTarget(element); - }); - - function render() { - var index = bsCollapseCtrl.$targets.indexOf(element); - var active = bsCollapseCtrl.$activeIndexes(); - var action = 'removeClass'; - if (angular.isArray(active)) { - if (active.indexOf(index) !== -1) { - action = 'addClass'; - } - } - else if (index === active) { - action = 'addClass'; - } - - $animate[action](element, bsCollapseCtrl.$options.activeClass); - } - - bsCollapseCtrl.$viewChangeListeners.push(function() { - render(); - }); - render(); - - } - }; - - }]); - -// Source: datepicker.js -angular.module('mgcrea.ngStrap.datepicker', [ - 'mgcrea.ngStrap.helpers.dateParser', - 'mgcrea.ngStrap.helpers.dateFormatter', - 'mgcrea.ngStrap.tooltip']) - - .provider('$datepicker', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - prefixClass: 'datepicker', - placement: 'bottom-left', - template: 'datepicker/datepicker.tpl.html', - trigger: 'focus', - container: false, - keyboard: true, - html: false, - delay: 0, - // lang: $locale.id, - useNative: false, - dateType: 'date', - dateFormat: 'shortDate', - modelDateFormat: null, - dayFormat: 'dd', - monthFormat: 'MMM', - yearFormat: 'yyyy', - monthTitleFormat: 'MMMM yyyy', - yearTitleFormat: 'yyyy', - strictFormat: false, - autoclose: false, - minDate: -Infinity, - maxDate: +Infinity, - startView: 0, - minView: 0, - startWeek: 0, - daysOfWeekDisabled: '', - iconLeft: 'glyphicon glyphicon-chevron-left', - iconRight: 'glyphicon glyphicon-chevron-right' - }; - - this.$get = ["$window", "$document", "$rootScope", "$sce", "$dateFormatter", "datepickerViews", "$tooltip", "$timeout", function($window, $document, $rootScope, $sce, $dateFormatter, datepickerViews, $tooltip, $timeout) { - - var bodyEl = angular.element($window.document.body); - var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent); - var isTouch = ('createTouch' in $window.document) && isNative; - if(!defaults.lang) defaults.lang = $dateFormatter.getDefaultLocale(); - - function DatepickerFactory(element, controller, config) { - - var $datepicker = $tooltip(element, angular.extend({}, defaults, config)); - var parentScope = config.scope; - var options = $datepicker.$options; - var scope = $datepicker.$scope; - if(options.startView) options.startView -= options.minView; - - // View vars - - var pickerViews = datepickerViews($datepicker); - $datepicker.$views = pickerViews.views; - var viewDate = pickerViews.viewDate; - scope.$mode = options.startView; - scope.$iconLeft = options.iconLeft; - scope.$iconRight = options.iconRight; - var $picker = $datepicker.$views[scope.$mode]; - - // Scope methods - - scope.$select = function(date) { - $datepicker.select(date); - }; - scope.$selectPane = function(value) { - $datepicker.$selectPane(value); - }; - scope.$toggleMode = function() { - $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length); - }; - - // Public methods - - $datepicker.update = function(date) { - // console.warn('$datepicker.update() newValue=%o', date); - if(angular.isDate(date) && !isNaN(date.getTime())) { - $datepicker.$date = date; - $picker.update.call($picker, date); - } - // Build only if pristine - $datepicker.$build(true); - }; - - $datepicker.updateDisabledDates = function(dateRanges) { - options.disabledDateRanges = dateRanges; - for(var i = 0, l = scope.rows.length; i < l; i++) { - angular.forEach(scope.rows[i], $datepicker.$setDisabledEl); - } - }; - - $datepicker.select = function(date, keep) { - // console.warn('$datepicker.select', date, scope.$mode); - if(!angular.isDate(controller.$dateValue)) controller.$dateValue = new Date(date); - if(!scope.$mode || keep) { - controller.$setViewValue(angular.copy(date)); - controller.$render(); - if(options.autoclose && !keep) { - $timeout(function() { $datepicker.hide(true); }); - } - } else { - angular.extend(viewDate, {year: date.getFullYear(), month: date.getMonth(), date: date.getDate()}); - $datepicker.setMode(scope.$mode - 1); - $datepicker.$build(); - } - }; - - $datepicker.setMode = function(mode) { - // console.warn('$datepicker.setMode', mode); - scope.$mode = mode; - $picker = $datepicker.$views[scope.$mode]; - $datepicker.$build(); - }; - - // Protected methods - - $datepicker.$build = function(pristine) { - // console.warn('$datepicker.$build() viewDate=%o', viewDate); - if(pristine === true && $picker.built) return; - if(pristine === false && !$picker.built) return; - $picker.build.call($picker); - }; - - $datepicker.$updateSelected = function() { - for(var i = 0, l = scope.rows.length; i < l; i++) { - angular.forEach(scope.rows[i], updateSelected); - } - }; - - $datepicker.$isSelected = function(date) { - return $picker.isSelected(date); - }; - - $datepicker.$setDisabledEl = function(el) { - el.disabled = $picker.isDisabled(el.date); - }; - - $datepicker.$selectPane = function(value) { - var steps = $picker.steps; - // set targetDate to first day of month to avoid problems with - // date values rollover. This assumes the viewDate does not - // depend on the day of the month - var targetDate = new Date(Date.UTC(viewDate.year + ((steps.year || 0) * value), viewDate.month + ((steps.month || 0) * value), 1)); - angular.extend(viewDate, {year: targetDate.getUTCFullYear(), month: targetDate.getUTCMonth(), date: targetDate.getUTCDate()}); - $datepicker.$build(); - }; - - $datepicker.$onMouseDown = function(evt) { - // Prevent blur on mousedown on .dropdown-menu - evt.preventDefault(); - evt.stopPropagation(); - // Emulate click for mobile devices - if(isTouch) { - var targetEl = angular.element(evt.target); - if(targetEl[0].nodeName.toLowerCase() !== 'button') { - targetEl = targetEl.parent(); - } - targetEl.triggerHandler('click'); - } - }; - - $datepicker.$onKeyDown = function(evt) { - if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return; - evt.preventDefault(); - evt.stopPropagation(); - - if(evt.keyCode === 13) { - if(!scope.$mode) { - return $datepicker.hide(true); - } else { - return scope.$apply(function() { $datepicker.setMode(scope.$mode - 1); }); - } - } - - // Navigate with keyboard - $picker.onKeyDown(evt); - parentScope.$digest(); - }; - - // Private - - function updateSelected(el) { - el.selected = $datepicker.$isSelected(el.date); - } - - function focusElement() { - element[0].focus(); - } - - // Overrides - - var _init = $datepicker.init; - $datepicker.init = function() { - if(isNative && options.useNative) { - element.prop('type', 'date'); - element.css('-webkit-appearance', 'textfield'); - return; - } else if(isTouch) { - element.prop('type', 'text'); - element.attr('readonly', 'true'); - element.on('click', focusElement); - } - _init(); - }; - - var _destroy = $datepicker.destroy; - $datepicker.destroy = function() { - if(isNative && options.useNative) { - element.off('click', focusElement); - } - _destroy(); - }; - - var _show = $datepicker.show; - $datepicker.show = function() { - _show(); - // use timeout to hookup the events to prevent - // event bubbling from being processed imediately. - $timeout(function() { - // if $datepicker is no longer showing, don't setup events - if(!$datepicker.$isShown) return; - $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown); - if(options.keyboard) { - element.on('keydown', $datepicker.$onKeyDown); - } - }, 0, false); - }; - - var _hide = $datepicker.hide; - $datepicker.hide = function(blur) { - if(!$datepicker.$isShown) return; - $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown); - if(options.keyboard) { - element.off('keydown', $datepicker.$onKeyDown); - } - _hide(blur); - }; - - return $datepicker; - - } - - DatepickerFactory.defaults = defaults; - return DatepickerFactory; - - }]; - - }) - - .directive('bsDatepicker', ["$window", "$parse", "$q", "$dateFormatter", "$dateParser", "$datepicker", function($window, $parse, $q, $dateFormatter, $dateParser, $datepicker) { - - var defaults = $datepicker.defaults; - var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent); - - return { - restrict: 'EAC', - require: 'ngModel', - link: function postLink(scope, element, attr, controller) { - - // Directive options - var options = {scope: scope, controller: controller}; - angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'dateType', 'dateFormat', 'modelDateFormat', 'dayFormat', 'strictFormat', 'startWeek', 'startDate', 'useNative', 'lang', 'startView', 'minView', 'iconLeft', 'iconRight', 'daysOfWeekDisabled', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Visibility binding support - attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) { - if(!datepicker || !angular.isDefined(newValue)) return; - if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(datepicker),?/i); - newValue === true ? datepicker.show() : datepicker.hide(); - }); - - // Initialize datepicker - var datepicker = $datepicker(element, controller, options); - options = datepicker.$options; - // Set expected iOS format - if(isNative && options.useNative) options.dateFormat = 'yyyy-MM-dd'; - - var lang = options.lang; - - var formatDate = function(date, format) { - return $dateFormatter.formatDate(date, format, lang); - }; - - var dateParser = $dateParser({format: options.dateFormat, lang: lang, strict: options.strictFormat}); - - // Observe attributes for changes - angular.forEach(['minDate', 'maxDate'], function(key) { - // console.warn('attr.$observe(%s)', key, attr[key]); - angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) { - // console.warn('attr.$observe(%s)=%o', key, newValue); - datepicker.$options[key] = dateParser.getDateForAttribute(key, newValue); - // Build only if dirty - !isNaN(datepicker.$options[key]) && datepicker.$build(false); - validateAgainstMinMaxDate(controller.$dateValue); - }); - }); - - // Watch model for changes - scope.$watch(attr.ngModel, function(newValue, oldValue) { - datepicker.update(controller.$dateValue); - }, true); - - // Normalize undefined/null/empty array, - // so that we don't treat changing from undefined->null as a change. - function normalizeDateRanges(ranges) { - if (!ranges || !ranges.length) return null; - return ranges; - } - - if (angular.isDefined(attr.disabledDates)) { - scope.$watch(attr.disabledDates, function(disabledRanges, previousValue) { - disabledRanges = normalizeDateRanges(disabledRanges); - previousValue = normalizeDateRanges(previousValue); - - if (disabledRanges) { - datepicker.updateDisabledDates(disabledRanges); - } - }); - } - - function validateAgainstMinMaxDate(parsedDate) { - if (!angular.isDate(parsedDate)) return; - var isMinValid = isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate; - var isMaxValid = isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate; - var isValid = isMinValid && isMaxValid; - controller.$setValidity('date', isValid); - controller.$setValidity('min', isMinValid); - controller.$setValidity('max', isMaxValid); - // Only update the model when we have a valid date - if(isValid) controller.$dateValue = parsedDate; - } - - // viewValue -> $parsers -> modelValue - controller.$parsers.unshift(function(viewValue) { - // console.warn('$parser("%s"): viewValue=%o', element.attr('ng-model'), viewValue); - // Null values should correctly reset the model value & validity - if(!viewValue) { - controller.$setValidity('date', true); - // BREAKING CHANGE: - // return null (not undefined) when input value is empty, so angularjs 1.3 - // ngModelController can go ahead and run validators, like ngRequired - return null; - } - var parsedDate = dateParser.parse(viewValue, controller.$dateValue); - if(!parsedDate || isNaN(parsedDate.getTime())) { - controller.$setValidity('date', false); - // return undefined, causes ngModelController to - // invalidate model value - return; - } else { - validateAgainstMinMaxDate(parsedDate); - } - if(options.dateType === 'string') { - return formatDate(parsedDate, options.modelDateFormat || options.dateFormat); - } else if(options.dateType === 'number') { - return controller.$dateValue.getTime(); - } else if(options.dateType === 'unix') { - return controller.$dateValue.getTime() / 1000; - } else if(options.dateType === 'iso') { - return controller.$dateValue.toISOString(); - } else { - return new Date(controller.$dateValue); - } - }); - - // modelValue -> $formatters -> viewValue - controller.$formatters.push(function(modelValue) { - // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue); - var date; - if(angular.isUndefined(modelValue) || modelValue === null) { - date = NaN; - } else if(angular.isDate(modelValue)) { - date = modelValue; - } else if(options.dateType === 'string') { - date = dateParser.parse(modelValue, null, options.modelDateFormat); - } else if(options.dateType === 'unix') { - date = new Date(modelValue * 1000); - } else { - date = new Date(modelValue); - } - // Setup default value? - // if(isNaN(date.getTime())) { - // var today = new Date(); - // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0); - // } - controller.$dateValue = date; - return getDateFormattedString(); - }); - - // viewValue -> element - controller.$render = function() { - // console.warn('$render("%s"): viewValue=%o', element.attr('ng-model'), controller.$viewValue); - element.val(getDateFormattedString()); - }; - - function getDateFormattedString() { - return !controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : formatDate(controller.$dateValue, options.dateFormat); - } - - // Garbage collection - scope.$on('$destroy', function() { - if(datepicker) datepicker.destroy(); - options = null; - datepicker = null; - }); - - } - }; - - }]) - - .provider('datepickerViews', function() { - - var defaults = this.defaults = { - dayFormat: 'dd', - daySplit: 7 - }; - - // Split array into smaller arrays - function split(arr, size) { - var arrays = []; - while(arr.length > 0) { - arrays.push(arr.splice(0, size)); - } - return arrays; - } - - // Modulus operator - function mod(n, m) { - return ((n % m) + m) % m; - } - - this.$get = ["$dateFormatter", "$dateParser", "$sce", function($dateFormatter, $dateParser, $sce) { - - return function(picker) { - - var scope = picker.$scope; - var options = picker.$options; - - var lang = options.lang; - var formatDate = function(date, format) { - return $dateFormatter.formatDate(date, format, lang); - }; - var dateParser = $dateParser({format: options.dateFormat, lang: lang, strict: options.strictFormat}); - - var weekDaysMin = $dateFormatter.weekdaysShort(lang); - var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek)); - var weekDaysLabelsHtml = $sce.trustAsHtml('' + weekDaysLabels.join('') + ''); - - var startDate = picker.$date || (options.startDate ? dateParser.getDateForAttribute('startDate', options.startDate) : new Date()); - var viewDate = {year: startDate.getFullYear(), month: startDate.getMonth(), date: startDate.getDate()}; - var timezoneOffset = startDate.getTimezoneOffset() * 6e4; - - var views = [{ - format: options.dayFormat, - split: 7, - steps: { month: 1 }, - update: function(date, force) { - if(!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) { - angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()}); - picker.$build(); - } else if(date.getDate() !== viewDate.date) { - viewDate.date = picker.$date.getDate(); - picker.$updateSelected(); - } - }, - build: function() { - var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset(); - var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 7) * 864e5), firstDateOffset = firstDate.getTimezoneOffset(); - var today = new Date().toDateString(); - // Handle daylight time switch - if(firstDateOffset !== firstDayOfMonthOffset) firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60e3); - var days = [], day; - for(var i = 0; i < 42; i++) { // < 7 * 6 - day = dateParser.daylightSavingAdjust(new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i)); - days.push({date: day, isToday: day.toDateString() === today, label: formatDate(day, this.format), selected: picker.$date && this.isSelected(day), muted: day.getMonth() !== viewDate.month, disabled: this.isDisabled(day)}); - } - scope.title = formatDate(firstDayOfMonth, options.monthTitleFormat); - scope.showLabels = true; - scope.labels = weekDaysLabelsHtml; - scope.rows = split(days, this.split); - this.built = true; - }, - isSelected: function(date) { - return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate(); - }, - isDisabled: function(date) { - var time = date.getTime(); - - // Disabled because of min/max date. - if (time < options.minDate || time > options.maxDate) return true; - - // Disabled due to being a disabled day of the week - if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1) return true; - - // Disabled because of disabled date range. - if (options.disabledDateRanges) { - for (var i = 0; i < options.disabledDateRanges.length; i++) { - if (time >= options.disabledDateRanges[i].start && time <= options.disabledDateRanges[i].end) { - return true; - } - } - } - - return false; - }, - onKeyDown: function(evt) { - if (!picker.$date) { - return; - } - var actualTime = picker.$date.getTime(); - var newDate; - - if(evt.keyCode === 37) newDate = new Date(actualTime - 1 * 864e5); - else if(evt.keyCode === 38) newDate = new Date(actualTime - 7 * 864e5); - else if(evt.keyCode === 39) newDate = new Date(actualTime + 1 * 864e5); - else if(evt.keyCode === 40) newDate = new Date(actualTime + 7 * 864e5); - - if (!this.isDisabled(newDate)) picker.select(newDate, true); - } - }, { - name: 'month', - format: options.monthFormat, - split: 4, - steps: { year: 1 }, - update: function(date, force) { - if(!this.built || date.getFullYear() !== viewDate.year) { - angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()}); - picker.$build(); - } else if(date.getMonth() !== viewDate.month) { - angular.extend(viewDate, {month: picker.$date.getMonth(), date: picker.$date.getDate()}); - picker.$updateSelected(); - } - }, - build: function() { - var firstMonth = new Date(viewDate.year, 0, 1); - var months = [], month; - for (var i = 0; i < 12; i++) { - month = new Date(viewDate.year, i, 1); - months.push({date: month, label: formatDate(month, this.format), selected: picker.$isSelected(month), disabled: this.isDisabled(month)}); - } - scope.title = formatDate(month, options.yearTitleFormat); - scope.showLabels = false; - scope.rows = split(months, this.split); - this.built = true; - }, - isSelected: function(date) { - return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth(); - }, - isDisabled: function(date) { - var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0); - return lastDate < options.minDate || date.getTime() > options.maxDate; - }, - onKeyDown: function(evt) { - if (!picker.$date) { - return; - } - var actualMonth = picker.$date.getMonth(); - var newDate = new Date(picker.$date); - - if(evt.keyCode === 37) newDate.setMonth(actualMonth - 1); - else if(evt.keyCode === 38) newDate.setMonth(actualMonth - 4); - else if(evt.keyCode === 39) newDate.setMonth(actualMonth + 1); - else if(evt.keyCode === 40) newDate.setMonth(actualMonth + 4); - - if (!this.isDisabled(newDate)) picker.select(newDate, true); - } - }, { - name: 'year', - format: options.yearFormat, - split: 4, - steps: { year: 12 }, - update: function(date, force) { - if(!this.built || force || parseInt(date.getFullYear()/20, 10) !== parseInt(viewDate.year/20, 10)) { - angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()}); - picker.$build(); - } else if(date.getFullYear() !== viewDate.year) { - angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()}); - picker.$updateSelected(); - } - }, - build: function() { - var firstYear = viewDate.year - viewDate.year % (this.split * 3); - var years = [], year; - for (var i = 0; i < 12; i++) { - year = new Date(firstYear + i, 0, 1); - years.push({date: year, label: formatDate(year, this.format), selected: picker.$isSelected(year), disabled: this.isDisabled(year)}); - } - scope.title = years[0].label + '-' + years[years.length - 1].label; - scope.showLabels = false; - scope.rows = split(years, this.split); - this.built = true; - }, - isSelected: function(date) { - return picker.$date && date.getFullYear() === picker.$date.getFullYear(); - }, - isDisabled: function(date) { - var lastDate = +new Date(date.getFullYear() + 1, 0, 0); - return lastDate < options.minDate || date.getTime() > options.maxDate; - }, - onKeyDown: function(evt) { - if (!picker.$date) { - return; - } - var actualYear = picker.$date.getFullYear(), - newDate = new Date(picker.$date); - - if(evt.keyCode === 37) newDate.setYear(actualYear - 1); - else if(evt.keyCode === 38) newDate.setYear(actualYear - 4); - else if(evt.keyCode === 39) newDate.setYear(actualYear + 1); - else if(evt.keyCode === 40) newDate.setYear(actualYear + 4); - - if (!this.isDisabled(newDate)) picker.select(newDate, true); - } - }]; - - return { - views: options.minView ? Array.prototype.slice.call(views, options.minView) : views, - viewDate: viewDate - }; - - }; - - }]; - - }); - -// Source: dropdown.js -angular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip']) - - .provider('$dropdown', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - prefixClass: 'dropdown', - placement: 'bottom-left', - template: 'dropdown/dropdown.tpl.html', - trigger: 'click', - container: false, - keyboard: true, - html: false, - delay: 0 - }; - - this.$get = ["$window", "$rootScope", "$tooltip", "$timeout", function($window, $rootScope, $tooltip, $timeout) { - - var bodyEl = angular.element($window.document.body); - var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector; - - function DropdownFactory(element, config) { - - var $dropdown = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new(); - - $dropdown = $tooltip(element, options); - var parentEl = element.parent(); - - // Protected methods - - $dropdown.$onKeyDown = function(evt) { - if (!/(38|40)/.test(evt.keyCode)) return; - evt.preventDefault(); - evt.stopPropagation(); - - // Retrieve focused index - var items = angular.element($dropdown.$element[0].querySelectorAll('li:not(.divider) a')); - if(!items.length) return; - var index; - angular.forEach(items, function(el, i) { - if(matchesSelector && matchesSelector.call(el, ':focus')) index = i; - }); - - // Navigate with keyboard - if(evt.keyCode === 38 && index > 0) index--; - else if(evt.keyCode === 40 && index < items.length - 1) index++; - else if(angular.isUndefined(index)) index = 0; - items.eq(index)[0].focus(); - - }; - - // Overrides - - var show = $dropdown.show; - $dropdown.show = function() { - show(); - // use timeout to hookup the events to prevent - // event bubbling from being processed imediately. - $timeout(function() { - options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown); - bodyEl.on('click', onBodyClick); - }, 0, false); - parentEl.hasClass('dropdown') && parentEl.addClass('open'); - }; - - var hide = $dropdown.hide; - $dropdown.hide = function() { - if(!$dropdown.$isShown) return; - options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown); - bodyEl.off('click', onBodyClick); - parentEl.hasClass('dropdown') && parentEl.removeClass('open'); - hide(); - }; - - var destroy = $dropdown.destroy; - $dropdown.destroy = function() { - bodyEl.off('click', onBodyClick); - destroy(); - }; - - // Private functions - - function onBodyClick(evt) { - if(evt.target === element[0]) return; - return evt.target !== element[0] && $dropdown.hide(); - } - - return $dropdown; - - } - - return DropdownFactory; - - }]; - - }) - - .directive('bsDropdown', ["$window", "$sce", "$dropdown", function($window, $sce, $dropdown) { - - return { - restrict: 'EAC', - scope: true, - link: function postLink(scope, element, attr, transclusion) { - - // Directive options - var options = {scope: scope}; - angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Support scope as an object - attr.bsDropdown && scope.$watch(attr.bsDropdown, function(newValue, oldValue) { - scope.content = newValue; - }, true); - - // Visibility binding support - attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) { - if(!dropdown || !angular.isDefined(newValue)) return; - if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(dropdown),?/i); - newValue === true ? dropdown.show() : dropdown.hide(); - }); - - // Initialize dropdown - var dropdown = $dropdown(element, options); - - // Garbage collection - scope.$on('$destroy', function() { - if (dropdown) dropdown.destroy(); - options = null; - dropdown = null; - }); - - } - }; - - }]); - -// Source: date-formatter.js -angular.module('mgcrea.ngStrap.helpers.dateFormatter', []) - - .service('$dateFormatter', ["$locale", "dateFilter", function($locale, dateFilter) { - - // The unused `lang` arguments are on purpose. The default implementation does not - // use them and it always uses the locale loaded into the `$locale` service. - // Custom implementations might use it, thus allowing different directives to - // have different languages. - - this.getDefaultLocale = function() { - return $locale.id; - }; - - // Format is either a data format name, e.g. "shortTime" or "fullDate", or a date format - // Return either the corresponding date format or the given date format. - this.getDatetimeFormat = function(format, lang) { - return $locale.DATETIME_FORMATS[format] || format; - }; - - this.weekdaysShort = function(lang) { - return $locale.DATETIME_FORMATS.SHORTDAY; - }; - - function splitTimeFormat(format) { - return /(h+)([:\.])?(m+)[ ]?(a?)/i.exec(format).slice(1); - } - - // h:mm a => h - this.hoursFormat = function(timeFormat) { - return splitTimeFormat(timeFormat)[0]; - }; - - // h:mm a => mm - this.minutesFormat = function(timeFormat) { - return splitTimeFormat(timeFormat)[2]; - }; - - // h:mm a => : - this.timeSeparator = function(timeFormat) { - return splitTimeFormat(timeFormat)[1]; - }; - - // h:mm a => true, H.mm => false - this.showAM = function(timeFormat) { - return !!splitTimeFormat(timeFormat)[3]; - }; - - this.formatDate = function(date, format, lang){ - return dateFilter(date, format); - }; - - }]); - -// Source: date-parser.js -angular.module('mgcrea.ngStrap.helpers.dateParser', []) - -.provider('$dateParser', ["$localeProvider", function($localeProvider) { - - // define a custom ParseDate object to use instead of native Date - // to avoid date values wrapping when setting date component values - function ParseDate() { - this.year = 1970; - this.month = 0; - this.day = 1; - this.hours = 0; - this.minutes = 0; - this.seconds = 0; - this.milliseconds = 0; - } - - ParseDate.prototype.setMilliseconds = function(value) { this.milliseconds = value; }; - ParseDate.prototype.setSeconds = function(value) { this.seconds = value; }; - ParseDate.prototype.setMinutes = function(value) { this.minutes = value; }; - ParseDate.prototype.setHours = function(value) { this.hours = value; }; - ParseDate.prototype.getHours = function() { return this.hours; }; - ParseDate.prototype.setDate = function(value) { this.day = value; }; - ParseDate.prototype.setMonth = function(value) { this.month = value; }; - ParseDate.prototype.setFullYear = function(value) { this.year = value; }; - ParseDate.prototype.fromDate = function(value) { - this.year = value.getFullYear(); - this.month = value.getMonth(); - this.day = value.getDate(); - this.hours = value.getHours(); - this.minutes = value.getMinutes(); - this.seconds = value.getSeconds(); - this.milliseconds = value.getMilliseconds(); - return this; - }; - - ParseDate.prototype.toDate = function() { - return new Date(this.year, this.month, this.day, this.hours, this.minutes, this.seconds, this.milliseconds); - }; - - var proto = ParseDate.prototype; - - function noop() { - } - - function isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function indexOfCaseInsensitive(array, value) { - var len = array.length, str=value.toString().toLowerCase(); - for (var i=0; i 12 when midnight changeover, but then cannot generate - * midnight datetime, so jump to 1AM, otherwise reset. - * @param date (Date) the date to check - * @return (Date) the corrected date - * - * __ copied from jquery ui datepicker __ - */ - $dateParser.daylightSavingAdjust = function(date) { - if (!date) { - return null; - } - date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); - return date; - }; - - // Private functions - - function setMapForFormat(format) { - var keys = Object.keys(setFnMap), i; - var map = [], sortedMap = []; - // Map to setFn - var clonedFormat = format; - for(i = 0; i < keys.length; i++) { - if(format.split(keys[i]).length > 1) { - var index = clonedFormat.search(keys[i]); - format = format.split(keys[i]).join(''); - if(setFnMap[keys[i]]) { - map[index] = setFnMap[keys[i]]; - } - } - } - // Sort result map - angular.forEach(map, function(v) { - // conditional required since angular.forEach broke around v1.2.21 - // related pr: https://github.com/angular/angular.js/pull/8525 - if(v) sortedMap.push(v); - }); - return sortedMap; - } - - function escapeReservedSymbols(text) { - return text.replace(/\//g, '[\\/]').replace('/-/g', '[-]').replace(/\./g, '[.]').replace(/\\s/g, '[\\s]'); - } - - function regExpForFormat(format) { - var keys = Object.keys(regExpMap), i; - - var re = format; - // Abstract replaces to avoid collisions - for(i = 0; i < keys.length; i++) { - re = re.split(keys[i]).join('${' + i + '}'); - } - // Replace abstracted values - for(i = 0; i < keys.length; i++) { - re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')'); - } - format = escapeReservedSymbols(format); - - return new RegExp('^' + re + '$', ['i']); - } - - $dateParser.init(); - return $dateParser; - - }; - - return DateParserFactory; - - }]; - -}]); - -// Source: debounce.js -angular.module('mgcrea.ngStrap.helpers.debounce', []) - -// @source jashkenas/underscore -// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L693 -.factory('debounce', ["$timeout", function($timeout) { - return function(func, wait, immediate) { - var timeout = null; - return function() { - var context = this, - args = arguments, - callNow = immediate && !timeout; - if(timeout) { - $timeout.cancel(timeout); - } - timeout = $timeout(function later() { - timeout = null; - if(!immediate) { - func.apply(context, args); - } - }, wait, false); - if(callNow) { - func.apply(context, args); - } - return timeout; - }; - }; -}]) - - -// @source jashkenas/underscore -// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L661 -.factory('throttle', ["$timeout", function($timeout) { - return function(func, wait, options) { - var timeout = null; - options || (options = {}); - return function() { - var context = this, - args = arguments; - if(!timeout) { - if(options.leading !== false) { - func.apply(context, args); - } - timeout = $timeout(function later() { - timeout = null; - if(options.trailing !== false) { - func.apply(context, args); - } - }, wait, false); - } - }; - }; -}]); - -// Source: dimensions.js -angular.module('mgcrea.ngStrap.helpers.dimensions', []) - - .factory('dimensions', ["$document", "$window", function($document, $window) { - - var jqLite = angular.element; - var fn = {}; - - /** - * Test the element nodeName - * @param element - * @param name - */ - var nodeName = fn.nodeName = function(element, name) { - return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase(); - }; - - /** - * Returns the element computed style - * @param element - * @param prop - * @param extra - */ - fn.css = function(element, prop, extra) { - var value; - if (element.currentStyle) { //IE - value = element.currentStyle[prop]; - } else if (window.getComputedStyle) { - value = window.getComputedStyle(element)[prop]; - } else { - value = element.style[prop]; - } - return extra === true ? parseFloat(value) || 0 : value; - }; - - /** - * Provides read-only equivalent of jQuery's offset function: - * @required-by bootstrap-tooltip, bootstrap-affix - * @url http://api.jquery.com/offset/ - * @param element - */ - fn.offset = function(element) { - var boxRect = element.getBoundingClientRect(); - var docElement = element.ownerDocument; - return { - width: boxRect.width || element.offsetWidth, - height: boxRect.height || element.offsetHeight, - top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0), - left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0) - }; - }; - - /** - * Provides read-only equivalent of jQuery's position function - * @required-by bootstrap-tooltip, bootstrap-affix - * @url http://api.jquery.com/offset/ - * @param element - */ - fn.position = function(element) { - - var offsetParentRect = {top: 0, left: 0}, - offsetParentElement, - offset; - - // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent - if (fn.css(element, 'position') === 'fixed') { - - // We assume that getBoundingClientRect is available when computed position is fixed - offset = element.getBoundingClientRect(); - - } else { - - // Get *real* offsetParentElement - offsetParentElement = offsetParent(element); - - // Get correct offsets - offset = fn.offset(element); - if (!nodeName(offsetParentElement, 'html')) { - offsetParentRect = fn.offset(offsetParentElement); - } - - // Add offsetParent borders - offsetParentRect.top += fn.css(offsetParentElement, 'borderTopWidth', true); - offsetParentRect.left += fn.css(offsetParentElement, 'borderLeftWidth', true); - } - - // Subtract parent offsets and element margins - return { - width: element.offsetWidth, - height: element.offsetHeight, - top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true), - left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true) - }; - - }; - - /** - * Returns the closest, non-statically positioned offsetParent of a given element - * @required-by fn.position - * @param element - */ - var offsetParent = function offsetParentElement(element) { - var docElement = element.ownerDocument; - var offsetParent = element.offsetParent || docElement; - if(nodeName(offsetParent, '#document')) return docElement.documentElement; - while(offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || docElement.documentElement; - }; - - /** - * Provides equivalent of jQuery's height function - * @required-by bootstrap-affix - * @url http://api.jquery.com/height/ - * @param element - * @param outer - */ - fn.height = function(element, outer) { - var value = element.offsetHeight; - if(outer) { - value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true); - } else { - value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true); - } - return value; - }; - - /** - * Provides equivalent of jQuery's width function - * @required-by bootstrap-affix - * @url http://api.jquery.com/width/ - * @param element - * @param outer - */ - fn.width = function(element, outer) { - var value = element.offsetWidth; - if(outer) { - value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true); - } else { - value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true); - } - return value; - }; - - return fn; - - }]); - -// Source: parse-options.js -angular.module('mgcrea.ngStrap.helpers.parseOptions', []) - - .provider('$parseOptions', function() { - - var defaults = this.defaults = { - regexp: /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/ - }; - - this.$get = ["$parse", "$q", function($parse, $q) { - - function ParseOptionsFactory(attr, config) { - - var $parseOptions = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - $parseOptions.$values = []; - - // Private vars - var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn; - - $parseOptions.init = function() { - $parseOptions.$match = match = attr.match(options.regexp); - displayFn = $parse(match[2] || match[1]), - valueName = match[4] || match[6], - keyName = match[5], - groupByFn = $parse(match[3] || ''), - valueFn = $parse(match[2] ? match[1] : valueName), - valuesFn = $parse(match[7]); - }; - - $parseOptions.valuesFn = function(scope, controller) { - return $q.when(valuesFn(scope, controller)) - .then(function(values) { - $parseOptions.$values = values ? parseValues(values, scope) : {}; - return $parseOptions.$values; - }); - }; - - $parseOptions.displayValue = function(modelValue) { - var scope = {}; - scope[valueName] = modelValue; - return displayFn(scope); - }; - - // Private functions - - function parseValues(values, scope) { - return values.map(function(match, index) { - var locals = {}, label, value; - locals[valueName] = match; - label = displayFn(scope, locals); - value = valueFn(scope, locals); - return {label: label, value: value, index: index}; - }); - } - - $parseOptions.init(); - return $parseOptions; - - } - - return ParseOptionsFactory; - - }]; - - }); - -// Source: raf.js -(angular.version.minor < 3 && angular.version.dot < 14) && angular.module('ng') - -.factory('$$rAF', ["$window", "$timeout", function($window, $timeout) { - - var requestAnimationFrame = $window.requestAnimationFrame || - $window.webkitRequestAnimationFrame || - $window.mozRequestAnimationFrame; - - var cancelAnimationFrame = $window.cancelAnimationFrame || - $window.webkitCancelAnimationFrame || - $window.mozCancelAnimationFrame || - $window.webkitCancelRequestAnimationFrame; - - var rafSupported = !!requestAnimationFrame; - var raf = rafSupported ? - function(fn) { - var id = requestAnimationFrame(fn); - return function() { - cancelAnimationFrame(id); - }; - } : - function(fn) { - var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 - return function() { - $timeout.cancel(timer); - }; - }; - - raf.supported = rafSupported; - - return raf; - -}]); - -// .factory('$$animateReflow', function($$rAF, $document) { - -// var bodyEl = $document[0].body; - -// return function(fn) { -// //the returned function acts as the cancellation function -// return $$rAF(function() { -// //the line below will force the browser to perform a repaint -// //so that all the animated elements within the animation frame -// //will be properly updated and drawn on screen. This is -// //required to perform multi-class CSS based animations with -// //Firefox. DO NOT REMOVE THIS LINE. -// var a = bodyEl.offsetWidth + 1; -// fn(); -// }); -// }; - -// }); - -// Source: modal.js -angular.module('mgcrea.ngStrap.modal', ['mgcrea.ngStrap.helpers.dimensions']) - - .provider('$modal', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - backdropAnimation: 'am-fade', - prefixClass: 'modal', - prefixEvent: 'modal', - placement: 'top', - template: 'modal/modal.tpl.html', - contentTemplate: false, - container: false, - element: null, - backdrop: true, - keyboard: true, - html: false, - show: true - }; - - this.$get = ["$window", "$rootScope", "$compile", "$q", "$templateCache", "$http", "$animate", "$timeout", "$sce", "dimensions", function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, $sce, dimensions) { - - var forEach = angular.forEach; - var trim = String.prototype.trim; - var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout; - var bodyElement = angular.element($window.document.body); - var htmlReplaceRegExp = /ng-bind="/ig; - - function ModalFactory(config) { - - var $modal = {}; - - // Common vars - var options = $modal.$options = angular.extend({}, defaults, config); - $modal.$promise = fetchTemplate(options.template); - var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new(); - if(!options.element && !options.container) { - options.container = 'body'; - } - - // store $id to identify the triggering element in events - // give priority to options.id, otherwise, try to use - // element id if defined - $modal.$id = options.id || options.element && options.element.attr('id') || ''; - - // Support scope as string options - forEach(['title', 'content'], function(key) { - if(options[key]) scope[key] = $sce.trustAsHtml(options[key]); - }); - - // Provide scope helpers - scope.$hide = function() { - scope.$$postDigest(function() { - $modal.hide(); - }); - }; - scope.$show = function() { - scope.$$postDigest(function() { - $modal.show(); - }); - }; - scope.$toggle = function() { - scope.$$postDigest(function() { - $modal.toggle(); - }); - }; - // Publish isShown as a protected var on scope - $modal.$isShown = scope.$isShown = false; - - // Support contentTemplate option - if(options.contentTemplate) { - $modal.$promise = $modal.$promise.then(function(template) { - var templateEl = angular.element(template); - return fetchTemplate(options.contentTemplate) - .then(function(contentTemplate) { - var contentEl = findElement('[ng-bind="content"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate); - // Drop the default footer as you probably don't want it if you use a custom contentTemplate - if(!config.template) contentEl.next().remove(); - return templateEl[0].outerHTML; - }); - }); - } - - // Fetch, compile then initialize modal - var modalLinker, modalElement; - var backdropElement = angular.element('
    '); - $modal.$promise.then(function(template) { - if(angular.isObject(template)) template = template.data; - if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html="'); - template = trim.apply(template); - modalLinker = $compile(template); - $modal.init(); - }); - - $modal.init = function() { - - // Options: show - if(options.show) { - scope.$$postDigest(function() { - $modal.show(); - }); - } - - }; - - $modal.destroy = function() { - - // Remove element - if(modalElement) { - modalElement.remove(); - modalElement = null; - } - if(backdropElement) { - backdropElement.remove(); - backdropElement = null; - } - - // Destroy scope - scope.$destroy(); - - }; - - $modal.show = function() { - if($modal.$isShown) return; - - if(scope.$emit(options.prefixEvent + '.show.before', $modal).defaultPrevented) { - return; - } - var parent, after; - if(angular.isElement(options.container)) { - parent = options.container; - after = options.container[0].lastChild ? angular.element(options.container[0].lastChild) : null; - } else { - if (options.container) { - parent = findElement(options.container); - after = parent[0].lastChild ? angular.element(parent[0].lastChild) : null; - } else { - parent = null; - after = options.element; - } - } - - // Fetch a cloned element linked from template - modalElement = $modal.$element = modalLinker(scope, function(clonedElement, scope) {}); - - // Set the initial positioning. - modalElement.css({display: 'block'}).addClass(options.placement); - - // Options: animation - if(options.animation) { - if(options.backdrop) { - backdropElement.addClass(options.backdropAnimation); - } - modalElement.addClass(options.animation); - } - - if(options.backdrop) { - $animate.enter(backdropElement, bodyElement, null); - } - // Support v1.3+ $animate - // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9 - var promise = $animate.enter(modalElement, parent, after, enterAnimateCallback); - if(promise && promise.then) promise.then(enterAnimateCallback); - - $modal.$isShown = scope.$isShown = true; - safeDigest(scope); - // Focus once the enter-animation has started - // Weird PhantomJS bug hack - var el = modalElement[0]; - requestAnimationFrame(function() { - el.focus(); - }); - - bodyElement.addClass(options.prefixClass + '-open'); - if(options.animation) { - bodyElement.addClass(options.prefixClass + '-with-' + options.animation); - } - - // Bind events - if(options.backdrop) { - modalElement.on('click', hideOnBackdropClick); - backdropElement.on('click', hideOnBackdropClick); - backdropElement.on('wheel', preventEventDefault); - } - if(options.keyboard) { - modalElement.on('keyup', $modal.$onKeyUp); - } - }; - - function enterAnimateCallback() { - scope.$emit(options.prefixEvent + '.show', $modal); - } - - $modal.hide = function() { - if(!$modal.$isShown) return; - - if(scope.$emit(options.prefixEvent + '.hide.before', $modal).defaultPrevented) { - return; - } - var promise = $animate.leave(modalElement, leaveAnimateCallback); - // Support v1.3+ $animate - // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9 - if(promise && promise.then) promise.then(leaveAnimateCallback); - - if(options.backdrop) { - $animate.leave(backdropElement); - } - $modal.$isShown = scope.$isShown = false; - safeDigest(scope); - - // Unbind events - if(options.backdrop) { - modalElement.off('click', hideOnBackdropClick); - backdropElement.off('click', hideOnBackdropClick); - backdropElement.off('wheel', preventEventDefault); - } - if(options.keyboard) { - modalElement.off('keyup', $modal.$onKeyUp); - } - }; - - function leaveAnimateCallback() { - scope.$emit(options.prefixEvent + '.hide', $modal); - bodyElement.removeClass(options.prefixClass + '-open'); - if(options.animation) { - bodyElement.removeClass(options.prefixClass + '-with-' + options.animation); - } - } - - $modal.toggle = function() { - - $modal.$isShown ? $modal.hide() : $modal.show(); - - }; - - $modal.focus = function() { - modalElement[0].focus(); - }; - - // Protected methods - - $modal.$onKeyUp = function(evt) { - - if (evt.which === 27 && $modal.$isShown) { - $modal.hide(); - evt.stopPropagation(); - } - - }; - - // Private methods - - function hideOnBackdropClick(evt) { - if(evt.target !== evt.currentTarget) return; - options.backdrop === 'static' ? $modal.focus() : $modal.hide(); - } - - function preventEventDefault(evt) { - evt.preventDefault(); - } - - return $modal; - - } - - // Helper functions - - function safeDigest(scope) { - scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest(); - } - - function findElement(query, element) { - return angular.element((element || document).querySelectorAll(query)); - } - - var fetchPromises = {}; - function fetchTemplate(template) { - if(fetchPromises[template]) return fetchPromises[template]; - return (fetchPromises[template] = $q.when($templateCache.get(template) || $http.get(template)) - .then(function(res) { - if(angular.isObject(res)) { - $templateCache.put(template, res.data); - return res.data; - } - return res; - })); - } - - return ModalFactory; - - }]; - - }) - - .directive('bsModal', ["$window", "$sce", "$modal", function($window, $sce, $modal) { - - return { - restrict: 'EAC', - scope: true, - link: function postLink(scope, element, attr, transclusion) { - - // Directive options - var options = {scope: scope, element: element, show: false}; - angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Support scope as data-attrs - angular.forEach(['title', 'content'], function(key) { - attr[key] && attr.$observe(key, function(newValue, oldValue) { - scope[key] = $sce.trustAsHtml(newValue); - }); - }); - - // Support scope as an object - attr.bsModal && scope.$watch(attr.bsModal, function(newValue, oldValue) { - if(angular.isObject(newValue)) { - angular.extend(scope, newValue); - } else { - scope.content = newValue; - } - }, true); - - // Initialize modal - var modal = $modal(options); - - // Trigger - element.on(attr.trigger || 'click', modal.toggle); - - // Garbage collection - scope.$on('$destroy', function() { - if (modal) modal.destroy(); - options = null; - modal = null; - }); - - } - }; - - }]); - -// Source: navbar.js -angular.module('mgcrea.ngStrap.navbar', []) - - .provider('$navbar', function() { - - var defaults = this.defaults = { - activeClass: 'active', - routeAttr: 'data-match-route', - strict: false - }; - - this.$get = function() { - return {defaults: defaults}; - }; - - }) - - .directive('bsNavbar', ["$window", "$location", "$navbar", function($window, $location, $navbar) { - - var defaults = $navbar.defaults; - - return { - restrict: 'A', - link: function postLink(scope, element, attr, controller) { - - // Directive options - var options = angular.copy(defaults); - angular.forEach(Object.keys(defaults), function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Watch for the $location - scope.$watch(function() { - - return $location.path(); - - }, function(newValue, oldValue) { - - var liElements = element[0].querySelectorAll('li[' + options.routeAttr + ']'); - - angular.forEach(liElements, function(li) { - - var liElement = angular.element(li); - var pattern = liElement.attr(options.routeAttr).replace('/', '\\/'); - if(options.strict) { - pattern = '^' + pattern + '$'; - } - var regexp = new RegExp(pattern, ['i']); - - if(regexp.test(newValue)) { - liElement.addClass(options.activeClass); - } else { - liElement.removeClass(options.activeClass); - } - - }); - - }); - - } - - }; - - }]); - -// Source: popover.js -angular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip']) - - .provider('$popover', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - customClass: '', - container: false, - target: false, - placement: 'right', - template: 'popover/popover.tpl.html', - contentTemplate: false, - trigger: 'click', - keyboard: true, - html: false, - title: '', - content: '', - delay: 0, - autoClose: false - }; - - this.$get = ["$tooltip", function($tooltip) { - - function PopoverFactory(element, config) { - - // Common vars - var options = angular.extend({}, defaults, config); - - var $popover = $tooltip(element, options); - - // Support scope as string options [/*title, */content] - if(options.content) { - $popover.$scope.content = options.content; - } - - return $popover; - - } - - return PopoverFactory; - - }]; - - }) - - .directive('bsPopover', ["$window", "$sce", "$popover", function($window, $sce, $popover) { - - var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout; - - return { - restrict: 'EAC', - scope: true, - link: function postLink(scope, element, attr) { - - // Directive options - var options = {scope: scope}; - angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'customClass', 'autoClose', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Support scope as data-attrs - angular.forEach(['title', 'content'], function(key) { - attr[key] && attr.$observe(key, function(newValue, oldValue) { - scope[key] = $sce.trustAsHtml(newValue); - angular.isDefined(oldValue) && requestAnimationFrame(function() { - popover && popover.$applyPlacement(); - }); - }); - }); - - // Support scope as an object - attr.bsPopover && scope.$watch(attr.bsPopover, function(newValue, oldValue) { - if(angular.isObject(newValue)) { - angular.extend(scope, newValue); - } else { - scope.content = newValue; - } - angular.isDefined(oldValue) && requestAnimationFrame(function() { - popover && popover.$applyPlacement(); - }); - }, true); - - // Visibility binding support - attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) { - if(!popover || !angular.isDefined(newValue)) return; - if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(popover),?/i); - newValue === true ? popover.show() : popover.hide(); - }); - - // Initialize popover - var popover = $popover(element, options); - - // Garbage collection - scope.$on('$destroy', function() { - if (popover) popover.destroy(); - options = null; - popover = null; - }); - - } - }; - - }]); - -// Source: select.js -angular.module('mgcrea.ngStrap.select', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions']) - - .provider('$select', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - prefixClass: 'select', - prefixEvent: '$select', - placement: 'bottom-left', - template: 'select/select.tpl.html', - trigger: 'focus', - container: false, - keyboard: true, - html: false, - delay: 0, - multiple: false, - allNoneButtons: false, - sort: true, - caretHtml: ' ', - placeholder: 'Choose among the following...', - allText: 'All', - noneText: 'None', - maxLength: 3, - maxLengthHtml: 'selected', - iconCheckmark: 'glyphicon glyphicon-ok' - }; - - this.$get = ["$window", "$document", "$rootScope", "$tooltip", "$timeout", function($window, $document, $rootScope, $tooltip, $timeout) { - - var bodyEl = angular.element($window.document.body); - var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent); - var isTouch = ('createTouch' in $window.document) && isNative; - - function SelectFactory(element, controller, config) { - - var $select = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - - $select = $tooltip(element, options); - var scope = $select.$scope; - - scope.$matches = []; - scope.$activeIndex = 0; - scope.$isMultiple = options.multiple; - scope.$showAllNoneButtons = options.allNoneButtons && options.multiple; - scope.$iconCheckmark = options.iconCheckmark; - scope.$allText = options.allText; - scope.$noneText = options.noneText; - - scope.$activate = function(index) { - scope.$$postDigest(function() { - $select.activate(index); - }); - }; - - scope.$select = function(index, evt) { - scope.$$postDigest(function() { - $select.select(index); - }); - }; - - scope.$isVisible = function() { - return $select.$isVisible(); - }; - - scope.$isActive = function(index) { - return $select.$isActive(index); - }; - - scope.$selectAll = function () { - for (var i = 0; i < scope.$matches.length; i++) { - if (!scope.$isActive(i)) { - scope.$select(i); - } - } - }; - - scope.$selectNone = function () { - for (var i = 0; i < scope.$matches.length; i++) { - if (scope.$isActive(i)) { - scope.$select(i); - } - } - }; - - // Public methods - - $select.update = function(matches) { - scope.$matches = matches; - $select.$updateActiveIndex(); - }; - - $select.activate = function(index) { - if(options.multiple) { - scope.$activeIndex.sort(); - $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index); - if(options.sort) scope.$activeIndex.sort(); - } else { - scope.$activeIndex = index; - } - return scope.$activeIndex; - }; - - $select.select = function(index) { - var value = scope.$matches[index].value; - scope.$apply(function() { - $select.activate(index); - if(options.multiple) { - controller.$setViewValue(scope.$activeIndex.map(function(index) { - return scope.$matches[index].value; - })); - } else { - controller.$setViewValue(value); - // Hide if single select - $select.hide(); - } - }); - // Emit event - scope.$emit(options.prefixEvent + '.select', value, index, $select); - }; - - // Protected methods - - $select.$updateActiveIndex = function() { - if(controller.$modelValue && scope.$matches.length) { - if(options.multiple && angular.isArray(controller.$modelValue)) { - scope.$activeIndex = controller.$modelValue.map(function(value) { - return $select.$getIndex(value); - }); - } else { - scope.$activeIndex = $select.$getIndex(controller.$modelValue); - } - } else if(scope.$activeIndex >= scope.$matches.length) { - scope.$activeIndex = options.multiple ? [] : 0; - } - }; - - $select.$isVisible = function() { - if(!options.minLength || !controller) { - return scope.$matches.length; - } - // minLength support - return scope.$matches.length && controller.$viewValue.length >= options.minLength; - }; - - $select.$isActive = function(index) { - if(options.multiple) { - return scope.$activeIndex.indexOf(index) !== -1; - } else { - return scope.$activeIndex === index; - } - }; - - $select.$getIndex = function(value) { - var l = scope.$matches.length, i = l; - if(!l) return; - for(i = l; i--;) { - if(scope.$matches[i].value === value) break; - } - if(i < 0) return; - return i; - }; - - $select.$onMouseDown = function(evt) { - // Prevent blur on mousedown on .dropdown-menu - evt.preventDefault(); - evt.stopPropagation(); - // Emulate click for mobile devices - if(isTouch) { - var targetEl = angular.element(evt.target); - targetEl.triggerHandler('click'); - } - }; - - $select.$onKeyDown = function(evt) { - if (!/(9|13|38|40)/.test(evt.keyCode)) return; - evt.preventDefault(); - evt.stopPropagation(); - - // Select with enter - if(!options.multiple && (evt.keyCode === 13 || evt.keyCode === 9)) { - return $select.select(scope.$activeIndex); - } - - // Navigate with keyboard - if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--; - else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++; - else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0; - scope.$digest(); - }; - - // Overrides - - var _show = $select.show; - $select.show = function() { - _show(); - if(options.multiple) { - $select.$element.addClass('select-multiple'); - } - // use timeout to hookup the events to prevent - // event bubbling from being processed imediately. - $timeout(function() { - $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown); - if(options.keyboard) { - element.on('keydown', $select.$onKeyDown); - } - }, 0, false); - }; - - var _hide = $select.hide; - $select.hide = function() { - $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown); - if(options.keyboard) { - element.off('keydown', $select.$onKeyDown); - } - _hide(true); - }; - - return $select; - - } - - SelectFactory.defaults = defaults; - return SelectFactory; - - }]; - - }) - - .directive('bsSelect', ["$window", "$parse", "$q", "$select", "$parseOptions", function($window, $parse, $q, $select, $parseOptions) { - - var defaults = $select.defaults; - - return { - restrict: 'EAC', - require: 'ngModel', - link: function postLink(scope, element, attr, controller) { - - // Directive options - var options = {scope: scope, placeholder: defaults.placeholder}; - angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'placeholder', 'multiple', 'allNoneButtons', 'maxLength', 'maxLengthHtml', 'allText', 'noneText', 'iconCheckmark', 'autoClose', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Add support for select markup - if(element[0].nodeName.toLowerCase() === 'select') { - var inputEl = element; - inputEl.css('display', 'none'); - element = angular.element(''); - inputEl.after(element); - } - - // Build proper ngOptions - var parsedOptions = $parseOptions(attr.ngOptions); - - // Initialize select - var select = $select(element, controller, options); - - // Watch ngOptions values before filtering for changes - var watchedOptions = parsedOptions.$match[7].replace(/\|.+/, '').trim(); - scope.$watch(watchedOptions, function(newValue, oldValue) { - // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue); - parsedOptions.valuesFn(scope, controller) - .then(function(values) { - select.update(values); - controller.$render(); - }); - }, true); - - // Watch model for changes - scope.$watch(attr.ngModel, function(newValue, oldValue) { - // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue); - select.$updateActiveIndex(); - controller.$render(); - }, true); - - // Model rendering in view - controller.$render = function () { - // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue); - var selected, index; - if(options.multiple && angular.isArray(controller.$modelValue)) { - selected = controller.$modelValue.map(function(value) { - index = select.$getIndex(value); - return angular.isDefined(index) ? select.$scope.$matches[index].label : false; - }).filter(angular.isDefined); - if(selected.length > (options.maxLength || defaults.maxLength)) { - selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml); - } else { - selected = selected.join(', '); - } - } else { - index = select.$getIndex(controller.$modelValue); - selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false; - } - element.html((selected ? selected : options.placeholder) + defaults.caretHtml); - }; - - if(options.multiple){ - controller.$isEmpty = function(value){ - return !value || value.length === 0; - }; - } - - // Garbage collection - scope.$on('$destroy', function() { - if (select) select.destroy(); - options = null; - select = null; - }); - - } - }; - - }]); - -// Source: tab.js -angular.module('mgcrea.ngStrap.tab', []) - - .provider('$tab', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - template: 'tab/tab.tpl.html', - navClass: 'nav-tabs', - activeClass: 'active' - }; - - var controller = this.controller = function($scope, $element, $attrs) { - var self = this; - - // Attributes options - self.$options = angular.copy(defaults); - angular.forEach(['animation', 'navClass', 'activeClass'], function(key) { - if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key]; - }); - - // Publish options on scope - $scope.$navClass = self.$options.navClass; - $scope.$activeClass = self.$options.activeClass; - - self.$panes = $scope.$panes = []; - - // DEPRECATED: $viewChangeListeners, please use $activePaneChangeListeners - // Because we deprecated ngModel usage, we rename viewChangeListeners to - // activePaneChangeListeners to make more sense. - self.$activePaneChangeListeners = self.$viewChangeListeners = []; - - self.$push = function(pane) { - self.$panes.push(pane); - }; - - self.$remove = function(pane) { - var index = self.$panes.indexOf(pane); - var activeIndex = self.$panes.$active; - - // remove pane from $panes array - self.$panes.splice(index, 1); - - if (index < activeIndex) { - // we removed a pane before the active pane, so we need to - // decrement the active pane index - activeIndex--; - } - else if (index === activeIndex && activeIndex === self.$panes.length) { - // we remove the active pane and it was the one at the end, - // so select the previous one - activeIndex--; - } - self.$setActive(activeIndex); - }; - - self.$panes.$active = 0; - self.$setActive = $scope.$setActive = function(value) { - self.$panes.$active = value; - self.$activePaneChangeListeners.forEach(function(fn) { - fn(); - }); - }; - - }; - - this.$get = function() { - var $tab = {}; - $tab.defaults = defaults; - $tab.controller = controller; - return $tab; - }; - - }) - - .directive('bsTabs', ["$window", "$animate", "$tab", "$parse", function($window, $animate, $tab, $parse) { - - var defaults = $tab.defaults; - - return { - require: ['?ngModel', 'bsTabs'], - transclude: true, - scope: true, - controller: ['$scope', '$element', '$attrs', $tab.controller], - templateUrl: function(element, attr) { - return attr.template || defaults.template; - }, - link: function postLink(scope, element, attrs, controllers) { - - var ngModelCtrl = controllers[0]; - var bsTabsCtrl = controllers[1]; - - // DEPRECATED: ngModel, please use bsActivePane - // 'ngModel' is deprecated bacause if interferes with form validation - // and status, so avoid using it here. - if(ngModelCtrl) { - console.warn('Usage of ngModel is deprecated, please use bsActivePane instead!'); - - // Update the modelValue following - bsTabsCtrl.$activePaneChangeListeners.push(function() { - ngModelCtrl.$setViewValue(bsTabsCtrl.$panes.$active); - }); - - // modelValue -> $formatters -> viewValue - ngModelCtrl.$formatters.push(function(modelValue) { - // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue); - bsTabsCtrl.$setActive(modelValue * 1); - return modelValue; - }); - - } - - if (attrs.bsActivePane) { - // adapted from angularjs ngModelController bindings - // https://github.com/angular/angular.js/blob/v1.3.1/src%2Fng%2Fdirective%2Finput.js#L1730 - var parsedBsActivePane = $parse(attrs.bsActivePane); - - // Update bsActivePane value with change - bsTabsCtrl.$activePaneChangeListeners.push(function() { - parsedBsActivePane.assign(scope, bsTabsCtrl.$panes.$active); - }); - - // watch bsActivePane for value changes - scope.$watch(attrs.bsActivePane, function(newValue, oldValue) { - bsTabsCtrl.$setActive(newValue * 1); - }, true); - } - } - }; - - }]) - - .directive('bsPane', ["$window", "$animate", "$sce", function($window, $animate, $sce) { - - return { - require: ['^?ngModel', '^bsTabs'], - scope: true, - link: function postLink(scope, element, attrs, controllers) { - - var ngModelCtrl = controllers[0]; - var bsTabsCtrl = controllers[1]; - - // Add base class - element.addClass('tab-pane'); - - // Observe title attribute for change - attrs.$observe('title', function(newValue, oldValue) { - scope.title = $sce.trustAsHtml(newValue); - }); - - // Add animation class - if(bsTabsCtrl.$options.animation) { - element.addClass(bsTabsCtrl.$options.animation); - } - - // Push pane to parent bsTabs controller - bsTabsCtrl.$push(scope); - - // remove pane from tab controller when pane is destroyed - scope.$on('$destroy', function() { - bsTabsCtrl.$remove(scope); - }); - - function render() { - var index = bsTabsCtrl.$panes.indexOf(scope); - var active = bsTabsCtrl.$panes.$active; - $animate[index === active ? 'addClass' : 'removeClass'](element, bsTabsCtrl.$options.activeClass); - } - - bsTabsCtrl.$activePaneChangeListeners.push(function() { - render(); - }); - render(); - - } - }; - - }]); - -// Source: scrollspy.js -angular.module('mgcrea.ngStrap.scrollspy', ['mgcrea.ngStrap.helpers.debounce', 'mgcrea.ngStrap.helpers.dimensions']) - - .provider('$scrollspy', function() { - - // Pool of registered spies - var spies = this.$$spies = {}; - - var defaults = this.defaults = { - debounce: 150, - throttle: 100, - offset: 100 - }; - - this.$get = ["$window", "$document", "$rootScope", "dimensions", "debounce", "throttle", function($window, $document, $rootScope, dimensions, debounce, throttle) { - - var windowEl = angular.element($window); - var docEl = angular.element($document.prop('documentElement')); - var bodyEl = angular.element($window.document.body); - - // Helper functions - - function nodeName(element, name) { - return element[0].nodeName && element[0].nodeName.toLowerCase() === name.toLowerCase(); - } - - function ScrollSpyFactory(config) { - - // Common vars - var options = angular.extend({}, defaults, config); - if(!options.element) options.element = bodyEl; - var isWindowSpy = nodeName(options.element, 'body'); - var scrollEl = isWindowSpy ? windowEl : options.element; - var scrollId = isWindowSpy ? 'window' : options.id; - - // Use existing spy - if(spies[scrollId]) { - spies[scrollId].$$count++; - return spies[scrollId]; - } - - var $scrollspy = {}; - - // Private vars - var unbindViewContentLoaded, unbindIncludeContentLoaded; - var trackedElements = $scrollspy.$trackedElements = []; - var sortedElements = []; - var activeTarget; - var debouncedCheckPosition; - var throttledCheckPosition; - var debouncedCheckOffsets; - var viewportHeight; - var scrollTop; - - $scrollspy.init = function() { - - // Setup internal ref counter - this.$$count = 1; - - // Bind events - debouncedCheckPosition = debounce(this.checkPosition, options.debounce); - throttledCheckPosition = throttle(this.checkPosition, options.throttle); - scrollEl.on('click', this.checkPositionWithEventLoop); - windowEl.on('resize', debouncedCheckPosition); - scrollEl.on('scroll', throttledCheckPosition); - - debouncedCheckOffsets = debounce(this.checkOffsets, options.debounce); - unbindViewContentLoaded = $rootScope.$on('$viewContentLoaded', debouncedCheckOffsets); - unbindIncludeContentLoaded = $rootScope.$on('$includeContentLoaded', debouncedCheckOffsets); - debouncedCheckOffsets(); - - // Register spy for reuse - if(scrollId) { - spies[scrollId] = $scrollspy; - } - - }; - - $scrollspy.destroy = function() { - - // Check internal ref counter - this.$$count--; - if(this.$$count > 0) { - return; - } - - // Unbind events - scrollEl.off('click', this.checkPositionWithEventLoop); - windowEl.off('resize', debouncedCheckPosition); - scrollEl.off('scroll', throttledCheckPosition); - unbindViewContentLoaded(); - unbindIncludeContentLoaded(); - if (scrollId) { - delete spies[scrollId]; - } - }; - - $scrollspy.checkPosition = function() { - - // Not ready yet - if(!sortedElements.length) return; - - // Calculate the scroll position - scrollTop = (isWindowSpy ? $window.pageYOffset : scrollEl.prop('scrollTop')) || 0; - - // Calculate the viewport height for use by the components - viewportHeight = Math.max($window.innerHeight, docEl.prop('clientHeight')); - - // Activate first element if scroll is smaller - if(scrollTop < sortedElements[0].offsetTop && activeTarget !== sortedElements[0].target) { - return $scrollspy.$activateElement(sortedElements[0]); - } - - // Activate proper element - for (var i = sortedElements.length; i--;) { - if(angular.isUndefined(sortedElements[i].offsetTop) || sortedElements[i].offsetTop === null) continue; - if(activeTarget === sortedElements[i].target) continue; - if(scrollTop < sortedElements[i].offsetTop) continue; - if(sortedElements[i + 1] && scrollTop > sortedElements[i + 1].offsetTop) continue; - return $scrollspy.$activateElement(sortedElements[i]); - } - - }; - - $scrollspy.checkPositionWithEventLoop = function() { - // IE 9 throws an error if we use 'this' instead of '$scrollspy' - // in this setTimeout call - setTimeout($scrollspy.checkPosition, 1); - }; - - // Protected methods - - $scrollspy.$activateElement = function(element) { - if(activeTarget) { - var activeElement = $scrollspy.$getTrackedElement(activeTarget); - if(activeElement) { - activeElement.source.removeClass('active'); - if(nodeName(activeElement.source, 'li') && nodeName(activeElement.source.parent().parent(), 'li')) { - activeElement.source.parent().parent().removeClass('active'); - } - } - } - activeTarget = element.target; - element.source.addClass('active'); - if(nodeName(element.source, 'li') && nodeName(element.source.parent().parent(), 'li')) { - element.source.parent().parent().addClass('active'); - } - }; - - $scrollspy.$getTrackedElement = function(target) { - return trackedElements.filter(function(obj) { - return obj.target === target; - })[0]; - }; - - // Track offsets behavior - - $scrollspy.checkOffsets = function() { - - angular.forEach(trackedElements, function(trackedElement) { - var targetElement = document.querySelector(trackedElement.target); - trackedElement.offsetTop = targetElement ? dimensions.offset(targetElement).top : null; - if(options.offset && trackedElement.offsetTop !== null) trackedElement.offsetTop -= options.offset * 1; - }); - - sortedElements = trackedElements - .filter(function(el) { - return el.offsetTop !== null; - }) - .sort(function(a, b) { - return a.offsetTop - b.offsetTop; - }); - - debouncedCheckPosition(); - - }; - - $scrollspy.trackElement = function(target, source) { - trackedElements.push({target: target, source: source}); - }; - - $scrollspy.untrackElement = function(target, source) { - var toDelete; - for (var i = trackedElements.length; i--;) { - if(trackedElements[i].target === target && trackedElements[i].source === source) { - toDelete = i; - break; - } - } - trackedElements = trackedElements.splice(toDelete, 1); - }; - - $scrollspy.activate = function(i) { - trackedElements[i].addClass('active'); - }; - - // Initialize plugin - - $scrollspy.init(); - return $scrollspy; - - } - - return ScrollSpyFactory; - - }]; - - }) - - .directive('bsScrollspy', ["$rootScope", "debounce", "dimensions", "$scrollspy", function($rootScope, debounce, dimensions, $scrollspy) { - - return { - restrict: 'EAC', - link: function postLink(scope, element, attr) { - - var options = {scope: scope}; - angular.forEach(['offset', 'target'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - var scrollspy = $scrollspy(options); - scrollspy.trackElement(options.target, element); - - scope.$on('$destroy', function() { - if (scrollspy) { - scrollspy.untrackElement(options.target, element); - scrollspy.destroy(); - } - options = null; - scrollspy = null; - }); - - } - }; - - }]) - - - .directive('bsScrollspyList', ["$rootScope", "debounce", "dimensions", "$scrollspy", function($rootScope, debounce, dimensions, $scrollspy) { - - return { - restrict: 'A', - compile: function postLink(element, attr) { - var children = element[0].querySelectorAll('li > a[href]'); - angular.forEach(children, function(child) { - var childEl = angular.element(child); - childEl.parent().attr('bs-scrollspy', '').attr('data-target', childEl.attr('href')); - }); - } - - }; - - }]); - -// Source: timepicker.js -angular.module('mgcrea.ngStrap.timepicker', [ - 'mgcrea.ngStrap.helpers.dateParser', - 'mgcrea.ngStrap.helpers.dateFormatter', - 'mgcrea.ngStrap.tooltip']) - - .provider('$timepicker', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - prefixClass: 'timepicker', - placement: 'bottom-left', - template: 'timepicker/timepicker.tpl.html', - trigger: 'focus', - container: false, - keyboard: true, - html: false, - delay: 0, - // lang: $locale.id, - useNative: true, - timeType: 'date', - timeFormat: 'shortTime', - modelTimeFormat: null, - autoclose: false, - minTime: -Infinity, - maxTime: +Infinity, - length: 5, - hourStep: 1, - minuteStep: 5, - iconUp: 'glyphicon glyphicon-chevron-up', - iconDown: 'glyphicon glyphicon-chevron-down', - arrowBehavior: 'pager' - }; - - this.$get = ["$window", "$document", "$rootScope", "$sce", "$dateFormatter", "$tooltip", "$timeout", function($window, $document, $rootScope, $sce, $dateFormatter, $tooltip, $timeout) { - - var bodyEl = angular.element($window.document.body); - var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent); - var isTouch = ('createTouch' in $window.document) && isNative; - if(!defaults.lang) defaults.lang = $dateFormatter.getDefaultLocale(); - - function timepickerFactory(element, controller, config) { - - var $timepicker = $tooltip(element, angular.extend({}, defaults, config)); - var parentScope = config.scope; - var options = $timepicker.$options; - var scope = $timepicker.$scope; - - var lang = options.lang; - var formatDate = function(date, format) { - return $dateFormatter.formatDate(date, format, lang); - }; - - // View vars - - var selectedIndex = 0; - var startDate = controller.$dateValue || new Date(); - var viewDate = {hour: startDate.getHours(), meridian: startDate.getHours() < 12, minute: startDate.getMinutes(), second: startDate.getSeconds(), millisecond: startDate.getMilliseconds()}; - - var format = $dateFormatter.getDatetimeFormat(options.timeFormat, lang); - - var hoursFormat = $dateFormatter.hoursFormat(format), - timeSeparator = $dateFormatter.timeSeparator(format), - minutesFormat = $dateFormatter.minutesFormat(format), - showAM = $dateFormatter.showAM(format); - - scope.$iconUp = options.iconUp; - scope.$iconDown = options.iconDown; - - // Scope methods - - scope.$select = function(date, index) { - $timepicker.select(date, index); - }; - scope.$moveIndex = function(value, index) { - $timepicker.$moveIndex(value, index); - }; - scope.$switchMeridian = function(date) { - $timepicker.switchMeridian(date); - }; - - // Public methods - - $timepicker.update = function(date) { - // console.warn('$timepicker.update() newValue=%o', date); - if(angular.isDate(date) && !isNaN(date.getTime())) { - $timepicker.$date = date; - angular.extend(viewDate, {hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), millisecond: date.getMilliseconds()}); - $timepicker.$build(); - } else if(!$timepicker.$isBuilt) { - $timepicker.$build(); - } - }; - - $timepicker.select = function(date, index, keep) { - // console.warn('$timepicker.select', date, scope.$mode); - if(!controller.$dateValue || isNaN(controller.$dateValue.getTime())) controller.$dateValue = new Date(1970, 0, 1); - if(!angular.isDate(date)) date = new Date(date); - if(index === 0) controller.$dateValue.setHours(date.getHours()); - else if(index === 1) controller.$dateValue.setMinutes(date.getMinutes()); - controller.$setViewValue(angular.copy(controller.$dateValue)); - controller.$render(); - if(options.autoclose && !keep) { - $timeout(function() { $timepicker.hide(true); }); - } - }; - - $timepicker.switchMeridian = function(date) { - if (!controller.$dateValue || isNaN(controller.$dateValue.getTime())) { - return; - } - var hours = (date || controller.$dateValue).getHours(); - controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12); - controller.$setViewValue(angular.copy(controller.$dateValue)); - controller.$render(); - }; - - // Protected methods - - $timepicker.$build = function() { - // console.warn('$timepicker.$build() viewDate=%o', viewDate); - var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10); - var hours = [], hour; - for(i = 0; i < options.length; i++) { - hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep); - hours.push({date: hour, label: formatDate(hour, hoursFormat), selected: $timepicker.$date && $timepicker.$isSelected(hour, 0), disabled: $timepicker.$isDisabled(hour, 0)}); - } - var minutes = [], minute; - for(i = 0; i < options.length; i++) { - minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep); - minutes.push({date: minute, label: formatDate(minute, minutesFormat), selected: $timepicker.$date && $timepicker.$isSelected(minute, 1), disabled: $timepicker.$isDisabled(minute, 1)}); - } - - var rows = []; - for(i = 0; i < options.length; i++) { - rows.push([hours[i], minutes[i]]); - } - scope.rows = rows; - scope.showAM = showAM; - scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12; - scope.timeSeparator = timeSeparator; - $timepicker.$isBuilt = true; - }; - - $timepicker.$isSelected = function(date, index) { - if(!$timepicker.$date) return false; - else if(index === 0) { - return date.getHours() === $timepicker.$date.getHours(); - } else if(index === 1) { - return date.getMinutes() === $timepicker.$date.getMinutes(); - } - }; - - $timepicker.$isDisabled = function(date, index) { - var selectedTime; - if(index === 0) { - selectedTime = date.getTime() + viewDate.minute * 6e4; - } else if(index === 1) { - selectedTime = date.getTime() + viewDate.hour * 36e5; - } - return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1; - }; - - scope.$arrowAction = function (value, index) { - if (options.arrowBehavior === 'picker') { - $timepicker.$setTimeByStep(value,index); - } else { - $timepicker.$moveIndex(value,index); - } - }; - - $timepicker.$setTimeByStep = function(value, index) { - var newDate = new Date($timepicker.$date); - var hours = newDate.getHours(), hoursLength = formatDate(newDate, hoursFormat).length; - var minutes = newDate.getMinutes(), minutesLength = formatDate(newDate, minutesFormat).length; - if (index === 0) { - newDate.setHours(hours - (parseInt(options.hourStep, 10) * value)); - } - else { - newDate.setMinutes(minutes - (parseInt(options.minuteStep, 10) * value)); - } - $timepicker.select(newDate, index, true); - }; - - $timepicker.$moveIndex = function(value, index) { - var targetDate; - if(index === 0) { - targetDate = new Date(1970, 0, 1, viewDate.hour + (value * options.length), viewDate.minute); - angular.extend(viewDate, {hour: targetDate.getHours()}); - } else if(index === 1) { - targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + (value * options.length * options.minuteStep)); - angular.extend(viewDate, {minute: targetDate.getMinutes()}); - } - $timepicker.$build(); - }; - - $timepicker.$onMouseDown = function(evt) { - // Prevent blur on mousedown on .dropdown-menu - if(evt.target.nodeName.toLowerCase() !== 'input') evt.preventDefault(); - evt.stopPropagation(); - // Emulate click for mobile devices - if(isTouch) { - var targetEl = angular.element(evt.target); - if(targetEl[0].nodeName.toLowerCase() !== 'button') { - targetEl = targetEl.parent(); - } - targetEl.triggerHandler('click'); - } - }; - - $timepicker.$onKeyDown = function(evt) { - if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return; - evt.preventDefault(); - evt.stopPropagation(); - - // Close on enter - if(evt.keyCode === 13) return $timepicker.hide(true); - - // Navigate with keyboard - var newDate = new Date($timepicker.$date); - var hours = newDate.getHours(), hoursLength = formatDate(newDate, hoursFormat).length; - var minutes = newDate.getMinutes(), minutesLength = formatDate(newDate, minutesFormat).length; - var lateralMove = /(37|39)/.test(evt.keyCode); - var count = 2 + showAM * 1; - - // Navigate indexes (left, right) - if (lateralMove) { - if(evt.keyCode === 37) selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1; - else if(evt.keyCode === 39) selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0; - } - - // Update values (up, down) - var selectRange = [0, hoursLength]; - if(selectedIndex === 0) { - if(evt.keyCode === 38) newDate.setHours(hours - parseInt(options.hourStep, 10)); - else if(evt.keyCode === 40) newDate.setHours(hours + parseInt(options.hourStep, 10)); - // re-calculate hours length because we have changed hours value - hoursLength = formatDate(newDate, hoursFormat).length; - selectRange = [0, hoursLength]; - } else if(selectedIndex === 1) { - if(evt.keyCode === 38) newDate.setMinutes(minutes - parseInt(options.minuteStep, 10)); - else if(evt.keyCode === 40) newDate.setMinutes(minutes + parseInt(options.minuteStep, 10)); - // re-calculate minutes length because we have changes minutes value - minutesLength = formatDate(newDate, minutesFormat).length; - selectRange = [hoursLength + 1, hoursLength + 1 + minutesLength]; - } else if(selectedIndex === 2) { - if(!lateralMove) $timepicker.switchMeridian(); - selectRange = [hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3]; - } - $timepicker.select(newDate, selectedIndex, true); - createSelection(selectRange[0], selectRange[1]); - parentScope.$digest(); - }; - - // Private - - function createSelection(start, end) { - if(element[0].createTextRange) { - var selRange = element[0].createTextRange(); - selRange.collapse(true); - selRange.moveStart('character', start); - selRange.moveEnd('character', end); - selRange.select(); - } else if(element[0].setSelectionRange) { - element[0].setSelectionRange(start, end); - } else if(angular.isUndefined(element[0].selectionStart)) { - element[0].selectionStart = start; - element[0].selectionEnd = end; - } - } - - function focusElement() { - element[0].focus(); - } - - // Overrides - - var _init = $timepicker.init; - $timepicker.init = function() { - if(isNative && options.useNative) { - element.prop('type', 'time'); - element.css('-webkit-appearance', 'textfield'); - return; - } else if(isTouch) { - element.prop('type', 'text'); - element.attr('readonly', 'true'); - element.on('click', focusElement); - } - _init(); - }; - - var _destroy = $timepicker.destroy; - $timepicker.destroy = function() { - if(isNative && options.useNative) { - element.off('click', focusElement); - } - _destroy(); - }; - - var _show = $timepicker.show; - $timepicker.show = function() { - _show(); - // use timeout to hookup the events to prevent - // event bubbling from being processed imediately. - $timeout(function() { - $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown); - if(options.keyboard) { - element.on('keydown', $timepicker.$onKeyDown); - } - }, 0, false); - }; - - var _hide = $timepicker.hide; - $timepicker.hide = function(blur) { - if(!$timepicker.$isShown) return; - $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown); - if(options.keyboard) { - element.off('keydown', $timepicker.$onKeyDown); - } - _hide(blur); - }; - - return $timepicker; - - } - - timepickerFactory.defaults = defaults; - return timepickerFactory; - - }]; - - }) - - - .directive('bsTimepicker', ["$window", "$parse", "$q", "$dateFormatter", "$dateParser", "$timepicker", function($window, $parse, $q, $dateFormatter, $dateParser, $timepicker) { - - var defaults = $timepicker.defaults; - var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent); - var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout; - - return { - restrict: 'EAC', - require: 'ngModel', - link: function postLink(scope, element, attr, controller) { - - // Directive options - var options = {scope: scope, controller: controller}; - angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'timeType', 'timeFormat', 'modelTimeFormat', 'useNative', 'hourStep', 'minuteStep', 'length', 'arrowBehavior', 'iconUp', 'iconDown', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Visibility binding support - attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) { - if(!timepicker || !angular.isDefined(newValue)) return; - if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(timepicker),?/i); - newValue === true ? timepicker.show() : timepicker.hide(); - }); - - // Initialize timepicker - if(isNative && (options.useNative || defaults.useNative)) options.timeFormat = 'HH:mm'; - var timepicker = $timepicker(element, controller, options); - options = timepicker.$options; - - var lang = options.lang; - var formatDate = function(date, format) { - return $dateFormatter.formatDate(date, format, lang); - }; - - // Initialize parser - var dateParser = $dateParser({format: options.timeFormat, lang: lang}); - - // Observe attributes for changes - angular.forEach(['minTime', 'maxTime'], function(key) { - // console.warn('attr.$observe(%s)', key, attr[key]); - angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) { - timepicker.$options[key] = dateParser.getTimeForAttribute(key, newValue); - !isNaN(timepicker.$options[key]) && timepicker.$build(); - validateAgainstMinMaxTime(controller.$dateValue); - }); - }); - - // Watch model for changes - scope.$watch(attr.ngModel, function(newValue, oldValue) { - // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue); - timepicker.update(controller.$dateValue); - }, true); - - function validateAgainstMinMaxTime(parsedTime) { - if (!angular.isDate(parsedTime)) return; - var isMinValid = isNaN(options.minTime) || new Date(parsedTime.getTime()).setFullYear(1970, 0, 1) >= options.minTime; - var isMaxValid = isNaN(options.maxTime) || new Date(parsedTime.getTime()).setFullYear(1970, 0, 1) <= options.maxTime; - var isValid = isMinValid && isMaxValid; - controller.$setValidity('date', isValid); - controller.$setValidity('min', isMinValid); - controller.$setValidity('max', isMaxValid); - // Only update the model when we have a valid date - if(!isValid) { - return; - } - controller.$dateValue = parsedTime; - } - - // viewValue -> $parsers -> modelValue - controller.$parsers.unshift(function(viewValue) { - // console.warn('$parser("%s"): viewValue=%o', element.attr('ng-model'), viewValue); - // Null values should correctly reset the model value & validity - if(!viewValue) { - // BREAKING CHANGE: - // return null (not undefined) when input value is empty, so angularjs 1.3 - // ngModelController can go ahead and run validators, like ngRequired - controller.$setValidity('date', true); - return null; - } - var parsedTime = angular.isDate(viewValue) ? viewValue : dateParser.parse(viewValue, controller.$dateValue); - if(!parsedTime || isNaN(parsedTime.getTime())) { - controller.$setValidity('date', false); - // return undefined, causes ngModelController to - // invalidate model value - return; - } else { - validateAgainstMinMaxTime(parsedTime); - } - if(options.timeType === 'string') { - return formatDate(parsedTime, options.modelTimeFormat || options.timeFormat); - } else if(options.timeType === 'number') { - return controller.$dateValue.getTime(); - } else if(options.timeType === 'unix') { - return controller.$dateValue.getTime() / 1000; - } else if(options.timeType === 'iso') { - return controller.$dateValue.toISOString(); - } else { - return new Date(controller.$dateValue); - } - }); - - // modelValue -> $formatters -> viewValue - controller.$formatters.push(function(modelValue) { - // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue); - var date; - if(angular.isUndefined(modelValue) || modelValue === null) { - date = NaN; - } else if(angular.isDate(modelValue)) { - date = modelValue; - } else if(options.timeType === 'string') { - date = dateParser.parse(modelValue, null, options.modelTimeFormat); - } else if(options.timeType === 'unix') { - date = new Date(modelValue * 1000); - } else { - date = new Date(modelValue); - } - // Setup default value? - // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5); - controller.$dateValue = date; - return getTimeFormattedString(); - }); - - // viewValue -> element - controller.$render = function() { - // console.warn('$render("%s"): viewValue=%o', element.attr('ng-model'), controller.$viewValue); - element.val(getTimeFormattedString()); - }; - - function getTimeFormattedString() { - return !controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : formatDate(controller.$dateValue, options.timeFormat); - } - - // Garbage collection - scope.$on('$destroy', function() { - if (timepicker) timepicker.destroy(); - options = null; - timepicker = null; - }); - - } - }; - - }]); - -// Source: tooltip.js -angular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions']) - - .provider('$tooltip', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - customClass: '', - prefixClass: 'tooltip', - prefixEvent: 'tooltip', - container: false, - target: false, - placement: 'top', - template: 'tooltip/tooltip.tpl.html', - contentTemplate: false, - trigger: 'hover focus', - keyboard: false, - html: false, - show: false, - title: '', - type: '', - delay: 0, - autoClose: false, - bsEnabled: true - }; - - this.$get = ["$window", "$rootScope", "$compile", "$q", "$templateCache", "$http", "$animate", "$sce", "dimensions", "$$rAF", "$timeout", function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $sce, dimensions, $$rAF, $timeout) { - - var trim = String.prototype.trim; - var isTouch = 'createTouch' in $window.document; - var htmlReplaceRegExp = /ng-bind="/ig; - var $body = angular.element($window.document); - - function TooltipFactory(element, config) { - - var $tooltip = {}; - - // Common vars - var nodeName = element[0].nodeName.toLowerCase(); - var options = $tooltip.$options = angular.extend({}, defaults, config); - $tooltip.$promise = fetchTemplate(options.template); - var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new(); - if(options.delay && angular.isString(options.delay)) { - var split = options.delay.split(',').map(parseFloat); - options.delay = split.length > 1 ? {show: split[0], hide: split[1]} : split[0]; - } - - // store $id to identify the triggering element in events - // give priority to options.id, otherwise, try to use - // element id if defined - $tooltip.$id = options.id || element.attr('id') || ''; - - // Support scope as string options - if(options.title) { - scope.title = $sce.trustAsHtml(options.title); - } - - // Provide scope helpers - scope.$setEnabled = function(isEnabled) { - scope.$$postDigest(function() { - $tooltip.setEnabled(isEnabled); - }); - }; - scope.$hide = function() { - scope.$$postDigest(function() { - $tooltip.hide(); - }); - }; - scope.$show = function() { - scope.$$postDigest(function() { - $tooltip.show(); - }); - }; - scope.$toggle = function() { - scope.$$postDigest(function() { - $tooltip.toggle(); - }); - }; - // Publish isShown as a protected var on scope - $tooltip.$isShown = scope.$isShown = false; - - // Private vars - var timeout, hoverState; - - // Support contentTemplate option - if(options.contentTemplate) { - $tooltip.$promise = $tooltip.$promise.then(function(template) { - var templateEl = angular.element(template); - return fetchTemplate(options.contentTemplate) - .then(function(contentTemplate) { - var contentEl = findElement('[ng-bind="content"]', templateEl[0]); - if(!contentEl.length) contentEl = findElement('[ng-bind="title"]', templateEl[0]); - contentEl.removeAttr('ng-bind').html(contentTemplate); - return templateEl[0].outerHTML; - }); - }); - } - - // Fetch, compile then initialize tooltip - var tipLinker, tipElement, tipTemplate, tipContainer, tipScope; - $tooltip.$promise.then(function(template) { - if(angular.isObject(template)) template = template.data; - if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html="'); - template = trim.apply(template); - tipTemplate = template; - tipLinker = $compile(template); - $tooltip.init(); - }); - - $tooltip.init = function() { - - // Options: delay - if (options.delay && angular.isNumber(options.delay)) { - options.delay = { - show: options.delay, - hide: options.delay - }; - } - - // Replace trigger on touch devices ? - // if(isTouch && options.trigger === defaults.trigger) { - // options.trigger.replace(/hover/g, 'click'); - // } - - // Options : container - if(options.container === 'self') { - tipContainer = element; - } else if(angular.isElement(options.container)) { - tipContainer = options.container; - } else if(options.container) { - tipContainer = findElement(options.container); - } - - // Options: trigger - bindTriggerEvents(); - - // Options: target - if(options.target) { - options.target = angular.isElement(options.target) ? options.target : findElement(options.target); - } - - // Options: show - if(options.show) { - scope.$$postDigest(function() { - options.trigger === 'focus' ? element[0].focus() : $tooltip.show(); - }); - } - - }; - - $tooltip.destroy = function() { - - // Unbind events - unbindTriggerEvents(); - - // Remove element - destroyTipElement(); - - // Destroy scope - scope.$destroy(); - - }; - - $tooltip.enter = function() { - - clearTimeout(timeout); - hoverState = 'in'; - if (!options.delay || !options.delay.show) { - return $tooltip.show(); - } - - timeout = setTimeout(function() { - if (hoverState ==='in') $tooltip.show(); - }, options.delay.show); - - }; - - $tooltip.show = function() { - if (!options.bsEnabled || $tooltip.$isShown) return; - - scope.$emit(options.prefixEvent + '.show.before', $tooltip); - var parent, after; - if (options.container) { - parent = tipContainer; - if (tipContainer[0].lastChild) { - after = angular.element(tipContainer[0].lastChild); - } else { - after = null; - } - } else { - parent = null; - after = element; - } - - - // Hide any existing tipElement - if(tipElement) destroyTipElement(); - // Fetch a cloned element linked from template - tipScope = $tooltip.$scope.$new(); - tipElement = $tooltip.$element = tipLinker(tipScope, function(clonedElement, scope) {}); - - // Set the initial positioning. Make the tooltip invisible - // so IE doesn't try to focus on it off screen. - tipElement.css({top: '-9999px', left: '-9999px', display: 'block', visibility: 'hidden'}); - - // Options: animation - if(options.animation) tipElement.addClass(options.animation); - // Options: type - if(options.type) tipElement.addClass(options.prefixClass + '-' + options.type); - // Options: custom classes - if(options.customClass) tipElement.addClass(options.customClass); - - // Support v1.3+ $animate - // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9 - var promise = $animate.enter(tipElement, parent, after, enterAnimateCallback); - if(promise && promise.then) promise.then(enterAnimateCallback); - - $tooltip.$isShown = scope.$isShown = true; - safeDigest(scope); - $$rAF(function () { - $tooltip.$applyPlacement(); - - // Once placed, make the tooltip visible - if(tipElement) tipElement.css({visibility: 'visible'}); - }); // var a = bodyEl.offsetWidth + 1; ? - - // Bind events - if(options.keyboard) { - if(options.trigger !== 'focus') { - $tooltip.focus(); - } - bindKeyboardEvents(); - } - - if(options.autoClose) { - bindAutoCloseEvents(); - } - - }; - - function enterAnimateCallback() { - scope.$emit(options.prefixEvent + '.show', $tooltip); - } - - $tooltip.leave = function() { - - clearTimeout(timeout); - hoverState = 'out'; - if (!options.delay || !options.delay.hide) { - return $tooltip.hide(); - } - timeout = setTimeout(function () { - if (hoverState === 'out') { - $tooltip.hide(); - } - }, options.delay.hide); - - }; - - var _blur; - var _tipToHide; - $tooltip.hide = function(blur) { - - if(!$tooltip.$isShown) return; - scope.$emit(options.prefixEvent + '.hide.before', $tooltip); - - // store blur value for leaveAnimateCallback to use - _blur = blur; - - // store current tipElement reference to use - // in leaveAnimateCallback - _tipToHide = tipElement; - - // Support v1.3+ $animate - // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9 - var promise = $animate.leave(tipElement, leaveAnimateCallback); - if(promise && promise.then) promise.then(leaveAnimateCallback); - - $tooltip.$isShown = scope.$isShown = false; - safeDigest(scope); - - // Unbind events - if(options.keyboard && tipElement !== null) { - unbindKeyboardEvents(); - } - - if(options.autoClose && tipElement !== null) { - unbindAutoCloseEvents(); - } - }; - - function leaveAnimateCallback() { - scope.$emit(options.prefixEvent + '.hide', $tooltip); - - // check if current tipElement still references - // the same element when hide was called - if (tipElement === _tipToHide) { - // Allow to blur the input when hidden, like when pressing enter key - if(_blur && options.trigger === 'focus') { - return element[0].blur(); - } - - // clean up child scopes - destroyTipElement(); - } - } - - $tooltip.toggle = function() { - $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter(); - }; - - $tooltip.focus = function() { - tipElement[0].focus(); - }; - - $tooltip.setEnabled = function(isEnabled) { - options.bsEnabled = isEnabled; - }; - - // Protected methods - - $tooltip.$applyPlacement = function() { - if(!tipElement) return; - - // Determine if we're doing an auto or normal placement - var placement = options.placement, - autoToken = /\s?auto?\s?/i, - autoPlace = autoToken.test(placement); - - if (autoPlace) { - placement = placement.replace(autoToken, '') || defaults.placement; - } - - // Need to add the position class before we get - // the offsets - tipElement.addClass(options.placement); - - // Get the position of the target element - // and the height and width of the tooltip so we can center it. - var elementPosition = getPosition(), - tipWidth = tipElement.prop('offsetWidth'), - tipHeight = tipElement.prop('offsetHeight'); - - // If we're auto placing, we need to check the positioning - if (autoPlace) { - var originalPlacement = placement; - var container = options.container ? angular.element(document.querySelector(options.container)) : element.parent(); - var containerPosition = getPosition(container); - - // Determine if the vertical placement - if (originalPlacement.indexOf('bottom') >= 0 && elementPosition.bottom + tipHeight > containerPosition.bottom) { - placement = originalPlacement.replace('bottom', 'top'); - } else if (originalPlacement.indexOf('top') >= 0 && elementPosition.top - tipHeight < containerPosition.top) { - placement = originalPlacement.replace('top', 'bottom'); - } - - // Determine the horizontal placement - // The exotic placements of left and right are opposite of the standard placements. Their arrows are put on the left/right - // and flow in the opposite direction of their placement. - if ((originalPlacement === 'right' || originalPlacement === 'bottom-left' || originalPlacement === 'top-left') && - elementPosition.right + tipWidth > containerPosition.width) { - - placement = originalPlacement === 'right' ? 'left' : placement.replace('left', 'right'); - } else if ((originalPlacement === 'left' || originalPlacement === 'bottom-right' || originalPlacement === 'top-right') && - elementPosition.left - tipWidth < containerPosition.left) { - - placement = originalPlacement === 'left' ? 'right' : placement.replace('right', 'left'); - } - - tipElement.removeClass(originalPlacement).addClass(placement); - } - - // Get the tooltip's top and left coordinates to center it with this directive. - var tipPosition = getCalculatedOffset(placement, elementPosition, tipWidth, tipHeight); - applyPlacementCss(tipPosition.top, tipPosition.left); - }; - - $tooltip.$onKeyUp = function(evt) { - if (evt.which === 27 && $tooltip.$isShown) { - $tooltip.hide(); - evt.stopPropagation(); - } - }; - - $tooltip.$onFocusKeyUp = function(evt) { - if (evt.which === 27) { - element[0].blur(); - evt.stopPropagation(); - } - }; - - $tooltip.$onFocusElementMouseDown = function(evt) { - evt.preventDefault(); - evt.stopPropagation(); - // Some browsers do not auto-focus buttons (eg. Safari) - $tooltip.$isShown ? element[0].blur() : element[0].focus(); - }; - - // bind/unbind events - function bindTriggerEvents() { - var triggers = options.trigger.split(' '); - angular.forEach(triggers, function(trigger) { - if(trigger === 'click') { - element.on('click', $tooltip.toggle); - } else if(trigger !== 'manual') { - element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter); - element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave); - nodeName === 'button' && trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown); - } - }); - } - - function unbindTriggerEvents() { - var triggers = options.trigger.split(' '); - for (var i = triggers.length; i--;) { - var trigger = triggers[i]; - if(trigger === 'click') { - element.off('click', $tooltip.toggle); - } else if(trigger !== 'manual') { - element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter); - element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave); - nodeName === 'button' && trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown); - } - } - } - - function bindKeyboardEvents() { - if(options.trigger !== 'focus') { - tipElement.on('keyup', $tooltip.$onKeyUp); - } else { - element.on('keyup', $tooltip.$onFocusKeyUp); - } - } - - function unbindKeyboardEvents() { - if(options.trigger !== 'focus') { - tipElement.off('keyup', $tooltip.$onKeyUp); - } else { - element.off('keyup', $tooltip.$onFocusKeyUp); - } - } - - var _autoCloseEventsBinded = false; - function bindAutoCloseEvents() { - // use timeout to hookup the events to prevent - // event bubbling from being processed imediately. - $timeout(function() { - // Stop propagation when clicking inside tooltip - tipElement.on('click', stopEventPropagation); - - // Hide when clicking outside tooltip - $body.on('click', $tooltip.hide); - - _autoCloseEventsBinded = true; - }, 0, false); - } - - function unbindAutoCloseEvents() { - if (_autoCloseEventsBinded) { - tipElement.off('click', stopEventPropagation); - $body.off('click', $tooltip.hide); - _autoCloseEventsBinded = false; - } - } - - function stopEventPropagation(event) { - event.stopPropagation(); - } - - // Private methods - - function getPosition($element) { - $element = $element || (options.target || element); - - var el = $element[0]; - - var elRect = el.getBoundingClientRect(); - if (elRect.width === null) { - // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 - elRect = angular.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }); - } - - var elPos; - if (options.container === 'body') { - elPos = dimensions.offset(el); - } else { - elPos = dimensions.position(el); - } - - return angular.extend({}, elRect, elPos); - } - - function getCalculatedOffset(placement, position, actualWidth, actualHeight) { - var offset; - var split = placement.split('-'); - - switch (split[0]) { - case 'right': - offset = { - top: position.top + position.height / 2 - actualHeight / 2, - left: position.left + position.width - }; - break; - case 'bottom': - offset = { - top: position.top + position.height, - left: position.left + position.width / 2 - actualWidth / 2 - }; - break; - case 'left': - offset = { - top: position.top + position.height / 2 - actualHeight / 2, - left: position.left - actualWidth - }; - break; - default: - offset = { - top: position.top - actualHeight, - left: position.left + position.width / 2 - actualWidth / 2 - }; - break; - } - - if(!split[1]) { - return offset; - } - - // Add support for corners @todo css - if(split[0] === 'top' || split[0] === 'bottom') { - switch (split[1]) { - case 'left': - offset.left = position.left; - break; - case 'right': - offset.left = position.left + position.width - actualWidth; - } - } else if(split[0] === 'left' || split[0] === 'right') { - switch (split[1]) { - case 'top': - offset.top = position.top - actualHeight; - break; - case 'bottom': - offset.top = position.top + position.height; - } - } - - return offset; - } - - function applyPlacementCss(top, left) { - tipElement.css({ top: top + 'px', left: left + 'px' }); - } - - function destroyTipElement() { - // Cancel pending callbacks - clearTimeout(timeout); - - if($tooltip.$isShown && tipElement !== null) { - if(options.autoClose) { - unbindAutoCloseEvents(); - } - - if(options.keyboard) { - unbindKeyboardEvents(); - } - } - - if(tipScope) { - tipScope.$destroy(); - tipScope = null; - } - - if(tipElement) { - tipElement.remove(); - tipElement = $tooltip.$element = null; - } - } - - return $tooltip; - - } - - // Helper functions - - function safeDigest(scope) { - scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest(); - } - - function findElement(query, element) { - return angular.element((element || document).querySelectorAll(query)); - } - - var fetchPromises = {}; - function fetchTemplate(template) { - if(fetchPromises[template]) return fetchPromises[template]; - return (fetchPromises[template] = $q.when($templateCache.get(template) || $http.get(template)) - .then(function(res) { - if(angular.isObject(res)) { - $templateCache.put(template, res.data); - return res.data; - } - return res; - })); - } - - return TooltipFactory; - - }]; - - }) - - .directive('bsTooltip', ["$window", "$location", "$sce", "$tooltip", "$$rAF", function($window, $location, $sce, $tooltip, $$rAF) { - - return { - restrict: 'EAC', - scope: true, - link: function postLink(scope, element, attr, transclusion) { - - // Directive options - var options = {scope: scope}; - angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'backdropAnimation', 'type', 'customClass', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // overwrite inherited title value when no value specified - // fix for angular 1.3.1 531a8de72c439d8ddd064874bf364c00cedabb11 - if (!scope.hasOwnProperty('title')){ - scope.title = ''; - } - - // Observe scope attributes for change - attr.$observe('title', function(newValue) { - if (angular.isDefined(newValue) || !scope.hasOwnProperty('title')) { - var oldValue = scope.title; - scope.title = $sce.trustAsHtml(newValue); - angular.isDefined(oldValue) && $$rAF(function() { - tooltip && tooltip.$applyPlacement(); - }); - } - }); - - // Support scope as an object - attr.bsTooltip && scope.$watch(attr.bsTooltip, function(newValue, oldValue) { - if(angular.isObject(newValue)) { - angular.extend(scope, newValue); - } else { - scope.title = newValue; - } - angular.isDefined(oldValue) && $$rAF(function() { - tooltip && tooltip.$applyPlacement(); - }); - }, true); - - // Visibility binding support - attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) { - if(!tooltip || !angular.isDefined(newValue)) return; - if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(tooltip),?/i); - newValue === true ? tooltip.show() : tooltip.hide(); - }); - - // Enabled binding support - attr.bsEnabled && scope.$watch(attr.bsEnabled, function(newValue, oldValue) { - // console.warn('scope.$watch(%s)', attr.bsEnabled, newValue, oldValue); - if(!tooltip || !angular.isDefined(newValue)) return; - if(angular.isString(newValue)) newValue = !!newValue.match(/true|1|,?(tooltip),?/i); - newValue === false ? tooltip.setEnabled(false) : tooltip.setEnabled(true); - }); - - // Initialize popover - var tooltip = $tooltip(element, options); - - // Garbage collection - scope.$on('$destroy', function() { - if(tooltip) tooltip.destroy(); - options = null; - tooltip = null; - }); - - } - }; - - }]); - -// Source: typeahead.js -angular.module('mgcrea.ngStrap.typeahead', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions']) - - .provider('$typeahead', function() { - - var defaults = this.defaults = { - animation: 'am-fade', - prefixClass: 'typeahead', - prefixEvent: '$typeahead', - placement: 'bottom-left', - template: 'typeahead/typeahead.tpl.html', - trigger: 'focus', - container: false, - keyboard: true, - html: false, - delay: 0, - minLength: 1, - filter: 'filter', - limit: 6, - comparator: '' - }; - - this.$get = ["$window", "$rootScope", "$tooltip", "$timeout", function($window, $rootScope, $tooltip, $timeout) { - - var bodyEl = angular.element($window.document.body); - - function TypeaheadFactory(element, controller, config) { - - var $typeahead = {}; - - // Common vars - var options = angular.extend({}, defaults, config); - - $typeahead = $tooltip(element, options); - var parentScope = config.scope; - var scope = $typeahead.$scope; - - scope.$resetMatches = function(){ - scope.$matches = []; - scope.$activeIndex = 0; - }; - scope.$resetMatches(); - - scope.$activate = function(index) { - scope.$$postDigest(function() { - $typeahead.activate(index); - }); - }; - - scope.$select = function(index, evt) { - scope.$$postDigest(function() { - $typeahead.select(index); - }); - }; - - scope.$isVisible = function() { - return $typeahead.$isVisible(); - }; - - // Public methods - - $typeahead.update = function(matches) { - scope.$matches = matches; - if(scope.$activeIndex >= matches.length) { - scope.$activeIndex = 0; - } - }; - - $typeahead.activate = function(index) { - scope.$activeIndex = index; - }; - - $typeahead.select = function(index) { - var value = scope.$matches[index].value; - // console.log('$setViewValue', value); - controller.$setViewValue(value); - controller.$render(); - scope.$resetMatches(); - if(parentScope) parentScope.$digest(); - // Emit event - scope.$emit(options.prefixEvent + '.select', value, index, $typeahead); - }; - - // Protected methods - - $typeahead.$isVisible = function() { - if(!options.minLength || !controller) { - return !!scope.$matches.length; - } - // minLength support - return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength; - }; - - $typeahead.$getIndex = function(value) { - var l = scope.$matches.length, i = l; - if(!l) return; - for(i = l; i--;) { - if(scope.$matches[i].value === value) break; - } - if(i < 0) return; - return i; - }; - - $typeahead.$onMouseDown = function(evt) { - // Prevent blur on mousedown - evt.preventDefault(); - evt.stopPropagation(); - }; - - $typeahead.$onKeyDown = function(evt) { - if(!/(38|40|13)/.test(evt.keyCode)) return; - - // Let ngSubmit pass if the typeahead tip is hidden - if($typeahead.$isVisible()) { - evt.preventDefault(); - evt.stopPropagation(); - } - - // Select with enter - if(evt.keyCode === 13 && scope.$matches.length) { - $typeahead.select(scope.$activeIndex); - } - - // Navigate with keyboard - else if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--; - else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++; - else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0; - scope.$digest(); - }; - - // Overrides - - var show = $typeahead.show; - $typeahead.show = function() { - show(); - // use timeout to hookup the events to prevent - // event bubbling from being processed imediately. - $timeout(function() { - $typeahead.$element.on('mousedown', $typeahead.$onMouseDown); - if(options.keyboard) { - element.on('keydown', $typeahead.$onKeyDown); - } - }, 0, false); - }; - - var hide = $typeahead.hide; - $typeahead.hide = function() { - $typeahead.$element.off('mousedown', $typeahead.$onMouseDown); - if(options.keyboard) { - element.off('keydown', $typeahead.$onKeyDown); - } - hide(); - }; - - return $typeahead; - - } - - TypeaheadFactory.defaults = defaults; - return TypeaheadFactory; - - }]; - - }) - - .directive('bsTypeahead', ["$window", "$parse", "$q", "$typeahead", "$parseOptions", function($window, $parse, $q, $typeahead, $parseOptions) { - - var defaults = $typeahead.defaults; - - return { - restrict: 'EAC', - require: 'ngModel', - link: function postLink(scope, element, attr, controller) { - - // Directive options - var options = {scope: scope}; - angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'filter', 'limit', 'minLength', 'watchOptions', 'selectMode', 'comparator', 'id'], function(key) { - if(angular.isDefined(attr[key])) options[key] = attr[key]; - }); - - // Build proper ngOptions - var filter = options.filter || defaults.filter; - var limit = options.limit || defaults.limit; - var comparator = options.comparator || defaults.comparator; - - var ngOptions = attr.ngOptions; - if(filter) ngOptions += ' | ' + filter + ':$viewValue'; - if (comparator) ngOptions += ':' + comparator; - if(limit) ngOptions += ' | limitTo:' + limit; - var parsedOptions = $parseOptions(ngOptions); - - // Initialize typeahead - var typeahead = $typeahead(element, controller, options); - - // Watch options on demand - if(options.watchOptions) { - // Watch ngOptions values before filtering for changes, drop function calls - var watchedOptions = parsedOptions.$match[7].replace(/\|.+/, '').replace(/\(.*\)/g, '').trim(); - scope.$watch(watchedOptions, function (newValue, oldValue) { - // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue); - parsedOptions.valuesFn(scope, controller).then(function (values) { - typeahead.update(values); - controller.$render(); - }); - }, true); - } - - // Watch model for changes - scope.$watch(attr.ngModel, function(newValue, oldValue) { - // console.warn('$watch', element.attr('ng-model'), newValue); - scope.$modelValue = newValue; // Publish modelValue on scope for custom templates - parsedOptions.valuesFn(scope, controller) - .then(function(values) { - // Prevent input with no future prospect if selectMode is truthy - // @TODO test selectMode - if(options.selectMode && !values.length && newValue.length > 0) { - controller.$setViewValue(controller.$viewValue.substring(0, controller.$viewValue.length - 1)); - return; - } - if(values.length > limit) values = values.slice(0, limit); - var isVisible = typeahead.$isVisible(); - isVisible && typeahead.update(values); - // Do not re-queue an update if a correct value has been selected - if(values.length === 1 && values[0].value === newValue) return; - !isVisible && typeahead.update(values); - // Queue a new rendering that will leverage collection loading - controller.$render(); - }); - }); - - // modelValue -> $formatters -> viewValue - controller.$formatters.push(function(modelValue) { - // console.warn('$formatter("%s"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue); - var displayValue = parsedOptions.displayValue(modelValue); - return displayValue === undefined ? '' : displayValue; - }); - - // Model rendering in view - controller.$render = function () { - // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue); - if(controller.$isEmpty(controller.$viewValue)) return element.val(''); - var index = typeahead.$getIndex(controller.$modelValue); - var selected = angular.isDefined(index) ? typeahead.$scope.$matches[index].label : controller.$viewValue; - selected = angular.isObject(selected) ? parsedOptions.displayValue(selected) : selected; - element.val(selected ? selected.toString().replace(/<(?:.|\n)*?>/gm, '').trim() : ''); - }; - - // Garbage collection - scope.$on('$destroy', function() { - if (typeahead) typeahead.destroy(); - options = null; - typeahead = null; - }); - - } - }; - - }]); - -})(window, document); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.min.js deleted file mode 100644 index 4ec9e143..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * angular-strap - * @version v2.1.6 - 2015-01-11 - * @link http://mgcrea.github.io/angular-strap - * @author Olivier Louvignes (olivier@mg-crea.com) - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -!function(e,t,n){"use strict";angular.module("mgcrea.ngStrap",["mgcrea.ngStrap.modal","mgcrea.ngStrap.aside","mgcrea.ngStrap.alert","mgcrea.ngStrap.button","mgcrea.ngStrap.select","mgcrea.ngStrap.datepicker","mgcrea.ngStrap.timepicker","mgcrea.ngStrap.navbar","mgcrea.ngStrap.tooltip","mgcrea.ngStrap.popover","mgcrea.ngStrap.dropdown","mgcrea.ngStrap.typeahead","mgcrea.ngStrap.scrollspy","mgcrea.ngStrap.affix","mgcrea.ngStrap.tab","mgcrea.ngStrap.collapse"]),angular.module("mgcrea.ngStrap.affix",["mgcrea.ngStrap.helpers.dimensions","mgcrea.ngStrap.helpers.debounce"]).provider("$affix",function(){var e=this.defaults={offsetTop:"auto"};this.$get=["$window","debounce","dimensions",function(t,n,a){function o(o,s){function l(e,t,n){var a=u(),o=c();return v>=a?"top":null!==e&&a+e<=t.top?"middle":null!==y&&t.top+n+$>=o-y?"bottom":"middle"}function u(){return p[0]===t?t.pageYOffset:p[0].scrollTop}function c(){return p[0]===t?t.document.body.scrollHeight:p[0].scrollHeight}var d={},f=angular.extend({},e,s),p=f.target,g="affix affix-top affix-bottom",m=!1,$=0,h=0,v=0,y=0,w=null,b=null,D=o.parent();if(f.offsetParent)if(f.offsetParent.match(/^\d+$/))for(var k=0;k<1*f.offsetParent-1;k++)D=D.parent();else D=angular.element(f.offsetParent);return d.init=function(){this.$parseOffsets(),h=a.offset(o[0]).top+$,m=!o[0].style.width,p.on("scroll",this.checkPosition),p.on("click",this.checkPositionWithEventLoop),r.on("resize",this.$debouncedOnResize),this.checkPosition(),this.checkPositionWithEventLoop()},d.destroy=function(){p.off("scroll",this.checkPosition),p.off("click",this.checkPositionWithEventLoop),r.off("resize",this.$debouncedOnResize)},d.checkPositionWithEventLoop=function(){setTimeout(d.checkPosition,1)},d.checkPosition=function(){var e=u(),t=a.offset(o[0]),n=a.height(o[0]),r=l(b,t,n);w!==r&&(w=r,o.removeClass(g).addClass("affix"+("middle"!==r?"-"+r:"")),"top"===r?(b=null,o.css("position",f.offsetParent?"":"relative"),m&&o.css("width",""),o.css("top","")):"bottom"===r?(b=f.offsetUnpin?-(1*f.offsetUnpin):t.top-e,m&&o.css("width",""),o.css("position",f.offsetParent?"":"relative"),o.css("top",f.offsetParent?"":i[0].offsetHeight-y-n-h+"px")):(b=null,m&&o.css("width",o[0].offsetWidth+"px"),o.css("position","fixed"),o.css("top",$+"px")))},d.$onResize=function(){d.$parseOffsets(),d.checkPosition()},d.$debouncedOnResize=n(d.$onResize,50),d.$parseOffsets=function(){var e=o.css("position");o.css("position",f.offsetParent?"":"relative"),f.offsetTop&&("auto"===f.offsetTop&&(f.offsetTop="+0"),f.offsetTop.match(/^[-+]\d+$/)?($=1*-f.offsetTop,v=f.offsetParent?a.offset(D[0]).top+1*f.offsetTop:a.offset(o[0]).top-a.css(o[0],"marginTop",!0)+1*f.offsetTop):v=1*f.offsetTop),f.offsetBottom&&(y=f.offsetParent&&f.offsetBottom.match(/^[-+]\d+$/)?c()-(a.offset(D[0]).top+a.height(D[0]))+1*f.offsetBottom+1:1*f.offsetBottom),o.css("position",e)},d.init(),d}var i=angular.element(t.document.body),r=angular.element(t);return o}]}).directive("bsAffix",["$affix","$window",function(e,t){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(n,a,o,i){var r={scope:n,offsetTop:"auto",target:i?i.$element:angular.element(t)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(e){angular.isDefined(o[e])&&(r[e]=o[e])});var s=e(a,r);n.$on("$destroy",function(){s&&s.destroy(),r=null,s=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(e){this.$element=e}]}}),angular.module("mgcrea.ngStrap.alert",["mgcrea.ngStrap.modal"]).provider("$alert",function(){var e=this.defaults={animation:"am-fade",prefixClass:"alert",prefixEvent:"alert",placement:null,template:"alert/alert.tpl.html",container:!1,element:null,backdrop:!1,keyboard:!0,show:!0,duration:!1,type:!1,dismissable:!0};this.$get=["$modal","$timeout",function(t,n){function a(a){var o={},i=angular.extend({},e,a);o=t(i),o.$scope.dismissable=!!i.dismissable,i.type&&(o.$scope.type=i.type);var r=o.show;return i.duration&&(o.show=function(){r(),n(function(){o.hide()},1e3*i.duration)}),o}return a}]}).directive("bsAlert",["$window","$sce","$alert",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration","dismissable"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content","type"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsAlert&&e.$watch(o.bsAlert,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r&&r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var e=this.defaults={animation:"am-fade-and-slide-right",prefixClass:"aside",prefixEvent:"aside",placement:"right",template:"aside/aside.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$modal",function(t){function n(n){var a={},o=angular.extend({},e,n);return a=t(o)}return n}]}).directive("bsAside",["$window","$sce","$aside",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsAside&&e.$watch(o.bsAside,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r&&r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.button",[]).provider("$button",function(){var e=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:e}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="checkbox"]');angular.forEach(n,function(e){var n=angular.element(e);n.attr("bs-checkbox",""),n.attr("ng-model",t.ngModel+"."+n.attr("value"))})}}}).directive("bsCheckbox",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var s=n,l="INPUT"===o[0].nodeName,u=l?o.parent():o,c=angular.isDefined(i.trueValue)?i.trueValue:!0;a.test(i.trueValue)&&(c=e.$eval(i.trueValue));var d=angular.isDefined(i.falseValue)?i.falseValue:!1;a.test(i.falseValue)&&(d=e.$eval(i.falseValue));var f="boolean"!=typeof c||"boolean"!=typeof d;f&&(r.$parsers.push(function(e){return e?c:d}),r.$formatters.push(function(e){return angular.equals(e,c)}),e.$watch(i.ngModel,function(){r.$render()})),r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){l||r.$setViewValue(!u.hasClass("active")),f||r.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="radio"]');angular.forEach(n,function(e){angular.element(e).attr("bs-radio",""),angular.element(e).attr("ng-model",t.ngModel)})}}}).directive("bsRadio",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var s=n,l="INPUT"===o[0].nodeName,u=l?o.parent():o,c=a.test(i.value)?e.$eval(i.value):i.value;r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){r.$setViewValue(c),r.$render()})})}}}]),angular.module("mgcrea.ngStrap.collapse",[]).provider("$collapse",function(){var e=this.defaults={animation:"am-collapse",disallowToggle:!1,activeClass:"in",startCollapsed:!1,allowMultiple:!1},t=this.controller=function(t,n,a){function o(e){for(var t=l.$targets.$active,n=0;nt;t++)angular.forEach(g.rows[t],u.$setDisabledEl)},u.select=function(e,t){angular.isDate(n.$dateValue)||(n.$dateValue=new Date(e)),!g.$mode||t?(n.$setViewValue(angular.copy(e)),n.$render(),p.autoclose&&!t&&l(function(){u.hide(!0)})):(angular.extend($,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),u.setMode(g.$mode-1),u.$build())},u.setMode=function(e){g.$mode=e,h=u.$views[g.$mode],u.$build()},u.$build=function(e){e===!0&&h.built||(e!==!1||h.built)&&h.build.call(h)},u.$updateSelected=function(){for(var e=0,t=g.rows.length;t>e;e++)angular.forEach(g.rows[e],o)},u.$isSelected=function(e){return h.isSelected(e)},u.$setDisabledEl=function(e){e.disabled=h.isDisabled(e.date)},u.$selectPane=function(e){var t=h.steps,n=new Date(Date.UTC($.year+(t.year||0)*e,$.month+(t.month||0)*e,1));angular.extend($,{year:n.getUTCFullYear(),month:n.getUTCMonth(),date:n.getUTCDate()}),u.$build()},u.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),d){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},u.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return g.$mode?g.$apply(function(){u.setMode(g.$mode-1)}):u.hide(!0);h.onKeyDown(e),f.$digest()}};var v=u.init;u.init=function(){return c&&p.useNative?(t.prop("type","date"),void t.css("-webkit-appearance","textfield")):(d&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",i)),void v())};var y=u.destroy;u.destroy=function(){c&&p.useNative&&t.off("click",i),y()};var w=u.show;u.show=function(){w(),l(function(){u.$isShown&&(u.$element.on(d?"touchstart":"mousedown",u.$onMouseDown),p.keyboard&&t.on("keydown",u.$onKeyDown))},0,!1)};var b=u.hide;return u.hide=function(e){u.$isShown&&(u.$element.off(d?"touchstart":"mousedown",u.$onMouseDown),p.keyboard&&t.off("keydown",u.$onKeyDown),b(e))},u}var c=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),d="createTouch"in t.document&&c;return e.lang||(e.lang=i.getDefaultLocale()),u.defaults=e,u}]}).directive("bsDatepicker",["$window","$parse","$q","$dateFormatter","$dateParser","$datepicker",function(e,t,n,a,o,i){var r=(i.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent));return{restrict:"EAC",require:"ngModel",link:function(e,t,n,s){function l(e){return e&&e.length?e:null}function u(e){if(angular.isDate(e)){var t=isNaN(f.$options.minDate)||e.getTime()>=f.$options.minDate,n=isNaN(f.$options.maxDate)||e.getTime()<=f.$options.maxDate,a=t&&n;s.$setValidity("date",a),s.$setValidity("min",t),s.$setValidity("max",n),a&&(s.$dateValue=e)}}function c(){return!s.$dateValue||isNaN(s.$dateValue.getTime())?"":g(s.$dateValue,d.dateFormat)}var d={scope:e,controller:s};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","startWeek","startDate","useNative","lang","startView","minView","iconLeft","iconRight","daysOfWeekDisabled","id"],function(e){angular.isDefined(n[e])&&(d[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){f&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(datepicker),?/i)),e===!0?f.show():f.hide())});var f=i(t,s,d);d=f.$options,r&&d.useNative&&(d.dateFormat="yyyy-MM-dd");var p=d.lang,g=function(e,t){return a.formatDate(e,t,p)},m=o({format:d.dateFormat,lang:p,strict:d.strictFormat});angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){f.$options[e]=m.getDateForAttribute(e,t),!isNaN(f.$options[e])&&f.$build(!1),u(s.$dateValue)})}),e.$watch(n.ngModel,function(){f.update(s.$dateValue)},!0),angular.isDefined(n.disabledDates)&&e.$watch(n.disabledDates,function(e,t){e=l(e),t=l(t),e&&f.updateDisabledDates(e)}),s.$parsers.unshift(function(e){if(!e)return s.$setValidity("date",!0),null;var t=m.parse(e,s.$dateValue);return!t||isNaN(t.getTime())?void s.$setValidity("date",!1):(u(t),"string"===d.dateType?g(t,d.modelDateFormat||d.dateFormat):"number"===d.dateType?s.$dateValue.getTime():"unix"===d.dateType?s.$dateValue.getTime()/1e3:"iso"===d.dateType?s.$dateValue.toISOString():new Date(s.$dateValue))}),s.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===d.dateType?m.parse(e,null,d.modelDateFormat):new Date("unix"===d.dateType?1e3*e:e),s.$dateValue=t,c()}),s.$render=function(){t.val(c())},e.$on("$destroy",function(){f&&f.destroy(),d=null,f=null})}}}]).provider("datepickerViews",function(){function e(e,t){for(var n=[];e.length>0;)n.push(e.splice(0,t));return n}function t(e,t){return(e%t+t)%t}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$dateFormatter","$dateParser","$sce",function(n,a,o){return function(i){var r=i.$scope,s=i.$options,l=s.lang,u=function(e,t){return n.formatDate(e,t,l)},c=a({format:s.dateFormat,lang:l,strict:s.strictFormat}),d=n.weekdaysShort(l),f=d.slice(s.startWeek).concat(d.slice(0,s.startWeek)),p=o.trustAsHtml(''+f.join('')+""),g=i.$date||(s.startDate?c.getDateForAttribute("startDate",s.startDate):new Date),m={year:g.getFullYear(),month:g.getMonth(),date:g.getDate()},$=(6e4*g.getTimezoneOffset(),[{format:s.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==m.year||e.getMonth()!==m.month?(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getDate()!==m.date&&(m.date=i.$date.getDate(),i.$updateSelected())},build:function(){var n=new Date(m.year,m.month,1),a=n.getTimezoneOffset(),o=new Date(+n-864e5*t(n.getDay()-s.startWeek,7)),l=o.getTimezoneOffset(),d=(new Date).toDateString();l!==a&&(o=new Date(+o+6e4*(l-a)));for(var f,g=[],$=0;42>$;$++)f=c.daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth(),o.getDate()+$)),g.push({date:f,isToday:f.toDateString()===d,label:u(f,this.format),selected:i.$date&&this.isSelected(f),muted:f.getMonth()!==m.month,disabled:this.isDisabled(f)});r.title=u(n,s.monthTitleFormat),r.showLabels=!0,r.labels=p,r.rows=e(g,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()&&e.getDate()===i.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(ts.maxDate)return!0;if(-1!==s.daysOfWeekDisabled.indexOf(e.getDay()))return!0;if(s.disabledDateRanges)for(var n=0;n=s.disabledDateRanges[n].start&&t<=s.disabledDateRanges[n].end)return!0;return!1},onKeyDown:function(e){if(i.$date){var t,n=i.$date.getTime();37===e.keyCode?t=new Date(n-864e5):38===e.keyCode?t=new Date(n-6048e5):39===e.keyCode?t=new Date(n+864e5):40===e.keyCode&&(t=new Date(n+6048e5)),this.isDisabled(t)||i.select(t,!0)}}},{name:"month",format:s.monthFormat,split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===m.year?e.getMonth()!==m.month&&(angular.extend(m,{month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected()):(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build())},build:function(){for(var t,n=(new Date(m.year,0,1),[]),a=0;12>a;a++)t=new Date(m.year,a,1),n.push({date:t,label:u(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=u(t,s.yearTitleFormat),r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return ts.maxDate},onKeyDown:function(e){if(i.$date){var t=i.$date.getMonth(),n=new Date(i.$date);37===e.keyCode?n.setMonth(t-1):38===e.keyCode?n.setMonth(t-4):39===e.keyCode?n.setMonth(t+1):40===e.keyCode&&n.setMonth(t+4),this.isDisabled(n)||i.select(n,!0)}}},{name:"year",format:s.yearFormat,split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(m.year/20,10)?(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getFullYear()!==m.year&&(angular.extend(m,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected())},build:function(){for(var t,n=m.year-m.year%(3*this.split),a=[],o=0;12>o;o++)t=new Date(n+o,0,1),a.push({date:t,label:u(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=a[0].label+"-"+a[a.length-1].label,r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return ts.maxDate},onKeyDown:function(e){if(i.$date){var t=i.$date.getFullYear(),n=new Date(i.$date);37===e.keyCode?n.setYear(t-1):38===e.keyCode?n.setYear(t-4):39===e.keyCode?n.setYear(t+1):40===e.keyCode&&n.setYear(t+4),this.isDisabled(n)||i.select(n,!0)}}}]);return{views:s.minView?Array.prototype.slice.call($,s.minView):$,viewDate:m}}}]}),angular.module("mgcrea.ngStrap.dropdown",["mgcrea.ngStrap.tooltip"]).provider("$dropdown",function(){var e=this.defaults={animation:"am-fade",prefixClass:"dropdown",placement:"bottom-left",template:"dropdown/dropdown.tpl.html",trigger:"click",container:!1,keyboard:!0,html:!1,delay:0};this.$get=["$window","$rootScope","$tooltip","$timeout",function(t,n,a,o){function i(t,i){function l(e){return e.target!==t[0]?e.target!==t[0]&&u.hide():void 0}{var u={},c=angular.extend({},e,i);u.$scope=c.scope&&c.scope.$new()||n.$new()}u=a(t,c);var d=t.parent();u.$onKeyDown=function(e){if(/(38|40)/.test(e.keyCode)){e.preventDefault(),e.stopPropagation();var t=angular.element(u.$element[0].querySelectorAll("li:not(.divider) a"));if(t.length){var n;angular.forEach(t,function(e,t){s&&s.call(e,":focus")&&(n=t)}),38===e.keyCode&&n>0?n--:40===e.keyCode&&no;o++)if(e[o].toLowerCase()===a)return o;return-1}e.prototype.setMilliseconds=function(e){this.milliseconds=e},e.prototype.setSeconds=function(e){this.seconds=e},e.prototype.setMinutes=function(e){this.minutes=e},e.prototype.setHours=function(e){this.hours=e},e.prototype.getHours=function(){return this.hours},e.prototype.setDate=function(e){this.day=e},e.prototype.setMonth=function(e){this.month=e},e.prototype.setFullYear=function(e){this.year=e},e.prototype.fromDate=function(e){return this.year=e.getFullYear(),this.month=e.getMonth(),this.day=e.getDate(),this.hours=e.getHours(),this.minutes=e.getMinutes(),this.seconds=e.getSeconds(),this.milliseconds=e.getMilliseconds(),this},e.prototype.toDate=function(){return new Date(this.year,this.month,this.day,this.hours,this.minutes,this.seconds,this.milliseconds)};var o=e.prototype,i=this.defaults={format:"shortDate",strict:!1};this.$get=["$locale","dateFilter",function(r,s){var l=function(l){function u(e){var t,n=Object.keys(h),a=[],o=[],i=e;for(t=0;t1){var r=i.search(n[t]);e=e.split(n[t]).join(""),h[n[t]]&&(a[r]=h[n[t]])}return angular.forEach(a,function(e){e&&o.push(e)}),o}function c(e){return e.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function d(e){var t,n=Object.keys($),a=e;for(t=0;t12?e.getHours()+2:0),e):null},m.init(),m};return l}]}]),angular.module("mgcrea.ngStrap.helpers.debounce",[]).factory("debounce",["$timeout",function(e){return function(t,n,a){var o=null;return function(){var i=this,r=arguments,s=a&&!o;return o&&e.cancel(o),o=e(function(){o=null,a||t.apply(i,r)},n,!1),s&&t.apply(i,r),o}}}]).factory("throttle",["$timeout",function(e){return function(t,n,a){var o=null;return a||(a={}),function(){var i=this,r=arguments;o||(a.leading!==!1&&t.apply(i,r),o=e(function(){o=null,a.trailing!==!1&&t.apply(i,r)},n,!1))}}}]),angular.module("mgcrea.ngStrap.helpers.dimensions",[]).factory("dimensions",["$document","$window",function(){var t=(angular.element,{}),n=t.nodeName=function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()};t.css=function(t,n,a){var o;return o=t.currentStyle?t.currentStyle[n]:e.getComputedStyle?e.getComputedStyle(t)[n]:t.style[n],a===!0?parseFloat(o)||0:o},t.offset=function(t){var n=t.getBoundingClientRect(),a=t.ownerDocument;return{width:n.width||t.offsetWidth,height:n.height||t.offsetHeight,top:n.top+(e.pageYOffset||a.documentElement.scrollTop)-(a.documentElement.clientTop||0),left:n.left+(e.pageXOffset||a.documentElement.scrollLeft)-(a.documentElement.clientLeft||0)}},t.position=function(e){var o,i,r={top:0,left:0};return"fixed"===t.css(e,"position")?i=e.getBoundingClientRect():(o=a(e),i=t.offset(e),n(o,"html")||(r=t.offset(o)),r.top+=t.css(o,"borderTopWidth",!0),r.left+=t.css(o,"borderLeftWidth",!0)),{width:e.offsetWidth,height:e.offsetHeight,top:i.top-r.top-t.css(e,"marginTop",!0),left:i.left-r.left-t.css(e,"marginLeft",!0)}};var a=function(e){var a=e.ownerDocument,o=e.offsetParent||a;if(n(o,"#document"))return a.documentElement;for(;o&&!n(o,"html")&&"static"===t.css(o,"position");)o=o.offsetParent;return o||a.documentElement};return t.height=function(e,n){var a=e.offsetHeight;return n?a+=t.css(e,"marginTop",!0)+t.css(e,"marginBottom",!0):a-=t.css(e,"paddingTop",!0)+t.css(e,"paddingBottom",!0)+t.css(e,"borderTopWidth",!0)+t.css(e,"borderBottomWidth",!0),a},t.width=function(e,n){var a=e.offsetWidth;return n?a+=t.css(e,"marginLeft",!0)+t.css(e,"marginRight",!0):a-=t.css(e,"paddingLeft",!0)+t.css(e,"paddingRight",!0)+t.css(e,"borderLeftWidth",!0)+t.css(e,"borderRightWidth",!0),a},t}]),angular.module("mgcrea.ngStrap.helpers.parseOptions",[]).provider("$parseOptions",function(){var e=this.defaults={regexp:/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/};this.$get=["$parse","$q",function(t,n){function a(a,o){function i(e,t){return e.map(function(e,n){var a,o,i={};return i[c]=e,a=u(t,i),o=p(t,i),{label:a,value:o,index:n}})}var r={},s=angular.extend({},e,o);r.$values=[];var l,u,c,d,f,p,g;return r.init=function(){r.$match=l=a.match(s.regexp),u=t(l[2]||l[1]),c=l[4]||l[6],d=l[5],f=t(l[3]||""),p=t(l[2]?l[1]:c),g=t(l[7])},r.valuesFn=function(e,t){return n.when(g(e,t)).then(function(t){return r.$values=t?i(t,e):{},r.$values -})},r.displayValue=function(e){var t={};return t[c]=e,u(t)},r.init(),r}return a}]}),angular.version.minor<3&&angular.version.dot<14&&angular.module("ng").factory("$$rAF",["$window","$timeout",function(e,t){var n=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame,a=e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelRequestAnimationFrame,o=!!n,i=o?function(e){var t=n(e);return function(){a(t)}}:function(e){var n=t(e,16.66,!1);return function(){t.cancel(n)}};return i.supported=o,i}]),angular.module("mgcrea.ngStrap.modal",["mgcrea.ngStrap.helpers.dimensions"]).provider("$modal",function(){var e=this.defaults={animation:"am-fade",backdropAnimation:"am-fade",prefixClass:"modal",prefixEvent:"modal",placement:"top",template:"modal/modal.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","$timeout","$sce","dimensions",function(n,a,o,i,r,s,l,u,c){function d(t){function n(){w.$emit(d.prefixEvent+".show",u)}function i(){w.$emit(d.prefixEvent+".hide",u),v.removeClass(d.prefixClass+"-open"),d.animation&&v.removeClass(d.prefixClass+"-with-"+d.animation)}function r(e){e.target===e.currentTarget&&("static"===d.backdrop?u.focus():u.hide())}function s(e){e.preventDefault()}var u={},d=u.$options=angular.extend({},e,t);u.$promise=g(d.template);var w=u.$scope=d.scope&&d.scope.$new()||a.$new();d.element||d.container||(d.container="body"),u.$id=d.id||d.element&&d.element.attr("id")||"",m(["title","content"],function(e){d[e]&&(w[e]=c.trustAsHtml(d[e]))}),w.$hide=function(){w.$$postDigest(function(){u.hide()})},w.$show=function(){w.$$postDigest(function(){u.show()})},w.$toggle=function(){w.$$postDigest(function(){u.toggle()})},u.$isShown=w.$isShown=!1,d.contentTemplate&&(u.$promise=u.$promise.then(function(e){var n=angular.element(e);return g(d.contentTemplate).then(function(e){var a=p('[ng-bind="content"]',n[0]).removeAttr("ng-bind").html(e);return t.template||a.next().remove(),n[0].outerHTML})}));var b,D,k=angular.element('
    ');return u.$promise.then(function(e){angular.isObject(e)&&(e=e.data),d.html&&(e=e.replace(y,'ng-bind-html="')),e=$.apply(e),b=o(e),u.init()}),u.init=function(){d.show&&w.$$postDigest(function(){u.show()})},u.destroy=function(){D&&(D.remove(),D=null),k&&(k.remove(),k=null),w.$destroy()},u.show=function(){if(!u.$isShown&&!w.$emit(d.prefixEvent+".show.before",u).defaultPrevented){var e,t;angular.isElement(d.container)?(e=d.container,t=d.container[0].lastChild?angular.element(d.container[0].lastChild):null):d.container?(e=p(d.container),t=e[0].lastChild?angular.element(e[0].lastChild):null):(e=null,t=d.element),D=u.$element=b(w,function(){}),D.css({display:"block"}).addClass(d.placement),d.animation&&(d.backdrop&&k.addClass(d.backdropAnimation),D.addClass(d.animation)),d.backdrop&&l.enter(k,v,null);var a=l.enter(D,e,t,n);a&&a.then&&a.then(n),u.$isShown=w.$isShown=!0,f(w);var o=D[0];h(function(){o.focus()}),v.addClass(d.prefixClass+"-open"),d.animation&&v.addClass(d.prefixClass+"-with-"+d.animation),d.backdrop&&(D.on("click",r),k.on("click",r),k.on("wheel",s)),d.keyboard&&D.on("keyup",u.$onKeyUp)}},u.hide=function(){if(u.$isShown&&!w.$emit(d.prefixEvent+".hide.before",u).defaultPrevented){var e=l.leave(D,i);e&&e.then&&e.then(i),d.backdrop&&l.leave(k),u.$isShown=w.$isShown=!1,f(w),d.backdrop&&(D.off("click",r),k.off("click",r),k.off("wheel",s)),d.keyboard&&D.off("keyup",u.$onKeyUp)}},u.toggle=function(){u.$isShown?u.hide():u.show()},u.focus=function(){D[0].focus()},u.$onKeyUp=function(e){27===e.which&&u.$isShown&&(u.hide(),e.stopPropagation())},u}function f(e){e.$$phase||e.$root&&e.$root.$$phase||e.$digest()}function p(e,n){return angular.element((n||t).querySelectorAll(e))}function g(e){return w[e]?w[e]:w[e]=i.when(r.get(e)||s.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=angular.forEach,$=String.prototype.trim,h=n.requestAnimationFrame||n.setTimeout,v=angular.element(n.document.body),y=/ng-bind="/gi,w={};return d}]}).directive("bsModal",["$window","$sce","$modal",function(e,t,n){return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation","id"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsModal&&e.$watch(o.bsModal,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r&&r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.navbar",[]).provider("$navbar",function(){var e=this.defaults={activeClass:"active",routeAttr:"data-match-route",strict:!1};this.$get=function(){return{defaults:e}}}).directive("bsNavbar",["$window","$location","$navbar",function(e,t,n){var a=n.defaults;return{restrict:"A",link:function(e,n,o){var i=angular.copy(a);angular.forEach(Object.keys(a),function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),e.$watch(function(){return t.path()},function(e){var t=n[0].querySelectorAll("li["+i.routeAttr+"]");angular.forEach(t,function(t){var n=angular.element(t),a=n.attr(i.routeAttr).replace("/","\\/");i.strict&&(a="^"+a+"$");var o=new RegExp(a,["i"]);o.test(e)?n.addClass(i.activeClass):n.removeClass(i.activeClass)})})}}}]),angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var e=this.defaults={animation:"am-fade",customClass:"",container:!1,target:!1,placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0,autoClose:!1};this.$get=["$tooltip",function(t){function n(n,a){var o=angular.extend({},e,a),i=t(n,o);return o.content&&(i.$scope.content=o.content),i}return n}]}).directive("bsPopover",["$window","$sce","$popover",function(e,t,n){var a=e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,o,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","customClass","autoClose","id"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title","content"],function(n){i[n]&&i.$observe(n,function(o,i){e[n]=t.trustAsHtml(o),angular.isDefined(i)&&a(function(){s&&s.$applyPlacement()})})}),i.bsPopover&&e.$watch(i.bsPopover,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t,angular.isDefined(n)&&a(function(){s&&s.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(popover),?/i)),e===!0?s.show():s.hide())});var s=n(o,r);e.$on("$destroy",function(){s&&s.destroy(),r=null,s=null})}}}]),angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",prefixEvent:"$select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",allText:"All",noneText:"None",maxLength:3,maxLengthHtml:"selected",iconCheckmark:"glyphicon glyphicon-ok"};this.$get=["$window","$document","$rootScope","$tooltip","$timeout",function(t,n,a,o,i){function r(t,n,a){var r={},s=angular.extend({},e,a);r=o(t,s);var u=r.$scope;u.$matches=[],u.$activeIndex=0,u.$isMultiple=s.multiple,u.$showAllNoneButtons=s.allNoneButtons&&s.multiple,u.$iconCheckmark=s.iconCheckmark,u.$allText=s.allText,u.$noneText=s.noneText,u.$activate=function(e){u.$$postDigest(function(){r.activate(e)})},u.$select=function(e){u.$$postDigest(function(){r.select(e)})},u.$isVisible=function(){return r.$isVisible()},u.$isActive=function(e){return r.$isActive(e)},u.$selectAll=function(){for(var e=0;e=u.$matches.length&&(u.$activeIndex=s.multiple?[]:0)},r.$isVisible=function(){return s.minLength&&n?u.$matches.length&&n.$viewValue.length>=s.minLength:u.$matches.length},r.$isActive=function(e){return s.multiple?-1!==u.$activeIndex.indexOf(e):u.$activeIndex===e},r.$getIndex=function(e){var t=u.$matches.length,n=t;if(t){for(n=t;n--&&u.$matches[n].value!==e;);if(!(0>n))return n}},r.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),l){var t=angular.element(e.target);t.triggerHandler("click")}},r.$onKeyDown=function(e){if(/(9|13|38|40)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),!s.multiple&&(13===e.keyCode||9===e.keyCode))return r.select(u.$activeIndex);38===e.keyCode&&u.$activeIndex>0?u.$activeIndex--:40===e.keyCode&&u.$activeIndex'),l.after(t)}var u=o(n.ngOptions),c=a(t,r,s),d=u.$match[7].replace(/\|.+/,"").trim();e.$watch(d,function(){u.valuesFn(e,r).then(function(e){c.update(e),r.$render()})},!0),e.$watch(n.ngModel,function(){c.$updateActiveIndex(),r.$render()},!0),r.$render=function(){var e,n;s.multiple&&angular.isArray(r.$modelValue)?(e=r.$modelValue.map(function(e){return n=c.$getIndex(e),angular.isDefined(n)?c.$scope.$matches[n].label:!1}).filter(angular.isDefined),e=e.length>(s.maxLength||i.maxLength)?e.length+" "+(s.maxLengthHtml||i.maxLengthHtml):e.join(", ")):(n=c.$getIndex(r.$modelValue),e=angular.isDefined(n)?c.$scope.$matches[n].label:!1),t.html((e?e:s.placeholder)+i.caretHtml)},s.multiple&&(r.$isEmpty=function(e){return!e||0===e.length}),e.$on("$destroy",function(){c&&c.destroy(),s=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tab",[]).provider("$tab",function(){var e=this.defaults={animation:"am-fade",template:"tab/tab.tpl.html",navClass:"nav-tabs",activeClass:"active"},t=this.controller=function(t,n,a){var o=this;o.$options=angular.copy(e),angular.forEach(["animation","navClass","activeClass"],function(e){angular.isDefined(a[e])&&(o.$options[e]=a[e])}),t.$navClass=o.$options.navClass,t.$activeClass=o.$options.activeClass,o.$panes=t.$panes=[],o.$activePaneChangeListeners=o.$viewChangeListeners=[],o.$push=function(e){o.$panes.push(e)},o.$remove=function(e){var t=o.$panes.indexOf(e),n=o.$panes.$active;o.$panes.splice(t,1),n>t?n--:t===n&&n===o.$panes.length&&n--,o.$setActive(n)},o.$panes.$active=0,o.$setActive=t.$setActive=function(e){o.$panes.$active=e,o.$activePaneChangeListeners.forEach(function(e){e()})}};this.$get=function(){var n={};return n.defaults=e,n.controller=t,n}}).directive("bsTabs",["$window","$animate","$tab","$parse",function(e,t,n,a){var o=n.defaults;return{require:["?ngModel","bsTabs"],transclude:!0,scope:!0,controller:["$scope","$element","$attrs",n.controller],templateUrl:function(e,t){return t.template||o.template},link:function(e,t,n,o){var i=o[0],r=o[1];if(i&&(console.warn("Usage of ngModel is deprecated, please use bsActivePane instead!"),r.$activePaneChangeListeners.push(function(){i.$setViewValue(r.$panes.$active)}),i.$formatters.push(function(e){return r.$setActive(1*e),e})),n.bsActivePane){var s=a(n.bsActivePane);r.$activePaneChangeListeners.push(function(){s.assign(e,r.$panes.$active)}),e.$watch(n.bsActivePane,function(e){r.$setActive(1*e)},!0)}}}}]).directive("bsPane",["$window","$animate","$sce",function(e,t,n){return{require:["^?ngModel","^bsTabs"],scope:!0,link:function(e,a,o,i){function r(){var n=s.$panes.indexOf(e),o=s.$panes.$active;t[n===o?"addClass":"removeClass"](a,s.$options.activeClass)}var s=(i[0],i[1]);a.addClass("tab-pane"),o.$observe("title",function(t){e.title=n.trustAsHtml(t)}),s.$options.animation&&a.addClass(s.$options.animation),s.$push(e),e.$on("$destroy",function(){s.$remove(e)}),s.$activePaneChangeListeners.push(function(){r()}),r()}}}]),angular.module("mgcrea.ngStrap.scrollspy",["mgcrea.ngStrap.helpers.debounce","mgcrea.ngStrap.helpers.dimensions"]).provider("$scrollspy",function(){var e=this.$$spies={},n=this.defaults={debounce:150,throttle:100,offset:100};this.$get=["$window","$document","$rootScope","dimensions","debounce","throttle",function(a,o,i,r,s,l){function u(e,t){return e[0].nodeName&&e[0].nodeName.toLowerCase()===t.toLowerCase()}function c(o){var c=angular.extend({},n,o);c.element||(c.element=p);var g=u(c.element,"body"),m=g?d:c.element,$=g?"window":c.id;if(e[$])return e[$].$$count++,e[$];var h,v,y,w,b,D,k,T,S={},x=S.$trackedElements=[],C=[];return S.init=function(){this.$$count=1,w=s(this.checkPosition,c.debounce),b=l(this.checkPosition,c.throttle),m.on("click",this.checkPositionWithEventLoop),d.on("resize",w),m.on("scroll",b),D=s(this.checkOffsets,c.debounce),h=i.$on("$viewContentLoaded",D),v=i.$on("$includeContentLoaded",D),D(),$&&(e[$]=S)},S.destroy=function(){this.$$count--,this.$$count>0||(m.off("click",this.checkPositionWithEventLoop),d.off("resize",w),m.off("scroll",b),h(),v(),$&&delete e[$])},S.checkPosition=function(){if(C.length){if(T=(g?a.pageYOffset:m.prop("scrollTop"))||0,k=Math.max(a.innerHeight,f.prop("clientHeight")),TC[e+1].offsetTop))return S.$activateElement(C[e])}},S.checkPositionWithEventLoop=function(){setTimeout(S.checkPosition,1)},S.$activateElement=function(e){if(y){var t=S.$getTrackedElement(y);t&&(t.source.removeClass("active"),u(t.source,"li")&&u(t.source.parent().parent(),"li")&&t.source.parent().parent().removeClass("active"))}y=e.target,e.source.addClass("active"),u(e.source,"li")&&u(e.source.parent().parent(),"li")&&e.source.parent().parent().addClass("active")},S.$getTrackedElement=function(e){return x.filter(function(t){return t.target===e})[0]},S.checkOffsets=function(){angular.forEach(x,function(e){var n=t.querySelector(e.target);e.offsetTop=n?r.offset(n).top:null,c.offset&&null!==e.offsetTop&&(e.offsetTop-=1*c.offset)}),C=x.filter(function(e){return null!==e.offsetTop}).sort(function(e,t){return e.offsetTop-t.offsetTop}),w()},S.trackElement=function(e,t){x.push({target:e,source:t})},S.untrackElement=function(e,t){for(var n,a=x.length;a--;)if(x[a].target===e&&x[a].source===t){n=a;break}x=x.splice(n,1)},S.activate=function(e){x[e].addClass("active")},S.init(),S}var d=angular.element(a),f=angular.element(o.prop("documentElement")),p=angular.element(a.document.body);return c}]}).directive("bsScrollspy",["$rootScope","debounce","dimensions","$scrollspy",function(e,t,n,a){return{restrict:"EAC",link:function(e,t,n){var o={scope:e};angular.forEach(["offset","target"],function(e){angular.isDefined(n[e])&&(o[e]=n[e])});var i=a(o);i.trackElement(o.target,t),e.$on("$destroy",function(){i&&(i.untrackElement(o.target,t),i.destroy()),o=null,i=null})}}}]).directive("bsScrollspyList",["$rootScope","debounce","dimensions","$scrollspy",function(){return{restrict:"A",compile:function(e){var t=e[0].querySelectorAll("li > a[href]");angular.forEach(t,function(e){var t=angular.element(e);t.parent().attr("bs-scrollspy","").attr("data-target",t.attr("href"))})}}}]),angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.helpers.dateFormatter","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"timepicker",placement:"bottom-left",template:"timepicker/timepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:"date",timeFormat:"shortTime",modelTimeFormat:null,autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5,iconUp:"glyphicon glyphicon-chevron-up",iconDown:"glyphicon glyphicon-chevron-down",arrowBehavior:"pager"};this.$get=["$window","$document","$rootScope","$sce","$dateFormatter","$tooltip","$timeout",function(t,n,a,o,i,r,s){function l(t,n,a){function o(e,n){if(t[0].createTextRange){var a=t[0].createTextRange();a.collapse(!0),a.moveStart("character",e),a.moveEnd("character",n),a.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,n):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=n)}function l(){t[0].focus()}var d=r(t,angular.extend({},e,a)),f=a.scope,p=d.$options,g=d.$scope,m=p.lang,$=function(e,t){return i.formatDate(e,t,m)},h=0,v=n.$dateValue||new Date,y={hour:v.getHours(),meridian:v.getHours()<12,minute:v.getMinutes(),second:v.getSeconds(),millisecond:v.getMilliseconds()},w=i.getDatetimeFormat(p.timeFormat,m),b=i.hoursFormat(w),D=i.timeSeparator(w),k=i.minutesFormat(w),T=i.showAM(w);g.$iconUp=p.iconUp,g.$iconDown=p.iconDown,g.$select=function(e,t){d.select(e,t)},g.$moveIndex=function(e,t){d.$moveIndex(e,t)},g.$switchMeridian=function(e){d.switchMeridian(e)},d.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(d.$date=e,angular.extend(y,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),d.$build()):d.$isBuilt||d.$build()},d.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t&&n.$dateValue.setMinutes(e.getMinutes()),n.$setViewValue(angular.copy(n.$dateValue)),n.$render(),p.autoclose&&!a&&s(function(){d.hide(!0)})},d.switchMeridian=function(e){if(n.$dateValue&&!isNaN(n.$dateValue.getTime())){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(angular.copy(n.$dateValue)),n.$render()}},d.$build=function(){var e,t,n=g.midIndex=parseInt(p.length/2,10),a=[];for(e=0;e1*p.maxTime},g.$arrowAction=function(e,t){"picker"===p.arrowBehavior?d.$setTimeByStep(e,t):d.$moveIndex(e,t)},d.$setTimeByStep=function(e,t){{var n=new Date(d.$date),a=n.getHours(),o=($(n,b).length,n.getMinutes());$(n,k).length}0===t?n.setHours(a-parseInt(p.hourStep,10)*e):n.setMinutes(o-parseInt(p.minuteStep,10)*e),d.select(n,t,!0)},d.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,y.hour+e*p.length,y.minute),angular.extend(y,{hour:n.getHours()})):1===t&&(n=new Date(1970,0,1,y.hour,y.minute+e*p.length*p.minuteStep),angular.extend(y,{minute:n.getMinutes()})),d.$build()},d.$onMouseDown=function(e){if("input"!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},d.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return d.hide(!0);var t=new Date(d.$date),n=t.getHours(),a=$(t,b).length,i=t.getMinutes(),r=$(t,k).length,s=/(37|39)/.test(e.keyCode),l=2+1*T;s&&(37===e.keyCode?h=1>h?l-1:h-1:39===e.keyCode&&(h=l-1>h?h+1:0));var u=[0,a];0===h?(38===e.keyCode?t.setHours(n-parseInt(p.hourStep,10)):40===e.keyCode&&t.setHours(n+parseInt(p.hourStep,10)),a=$(t,b).length,u=[0,a]):1===h?(38===e.keyCode?t.setMinutes(i-parseInt(p.minuteStep,10)):40===e.keyCode&&t.setMinutes(i+parseInt(p.minuteStep,10)),r=$(t,k).length,u=[a+1,a+1+r]):2===h&&(s||d.switchMeridian(),u=[a+1+r+1,a+1+r+3]),d.select(t,h,!0),o(u[0],u[1]),f.$digest()}};var S=d.init;d.init=function(){return u&&p.useNative?(t.prop("type","time"),void t.css("-webkit-appearance","textfield")):(c&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",l)),void S())};var x=d.destroy;d.destroy=function(){u&&p.useNative&&t.off("click",l),x()};var C=d.show;d.show=function(){C(),s(function(){d.$element.on(c?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.on("keydown",d.$onKeyDown)},0,!1)};var M=d.hide;return d.hide=function(e){d.$isShown&&(d.$element.off(c?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.off("keydown",d.$onKeyDown),M(e))},d}var u=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),c="createTouch"in t.document&&u;return e.lang||(e.lang=i.getDefaultLocale()),l.defaults=e,l}]}).directive("bsTimepicker",["$window","$parse","$q","$dateFormatter","$dateParser","$timepicker",function(e,t,n,a,o,i){{var r=i.defaults,s=/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent);e.requestAnimationFrame||e.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(e,t,n,l){function u(e){if(angular.isDate(e)){var t=isNaN(d.minTime)||new Date(e.getTime()).setFullYear(1970,0,1)>=d.minTime,n=isNaN(d.maxTime)||new Date(e.getTime()).setFullYear(1970,0,1)<=d.maxTime,a=t&&n;l.$setValidity("date",a),l.$setValidity("min",t),l.$setValidity("max",n),a&&(l.$dateValue=e)}}function c(){return!l.$dateValue||isNaN(l.$dateValue.getTime())?"":g(l.$dateValue,d.timeFormat)}var d={scope:e,controller:l};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","modelTimeFormat","useNative","hourStep","minuteStep","length","arrowBehavior","iconUp","iconDown","id"],function(e){angular.isDefined(n[e])&&(d[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){f&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(/true|,?(timepicker),?/i)),e===!0?f.show():f.hide())}),s&&(d.useNative||r.useNative)&&(d.timeFormat="HH:mm");var f=i(t,l,d);d=f.$options;var p=d.lang,g=function(e,t){return a.formatDate(e,t,p)},m=o({format:d.timeFormat,lang:p});angular.forEach(["minTime","maxTime"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){f.$options[e]=m.getTimeForAttribute(e,t),!isNaN(f.$options[e])&&f.$build(),u(l.$dateValue)})}),e.$watch(n.ngModel,function(){f.update(l.$dateValue)},!0),l.$parsers.unshift(function(e){if(!e)return l.$setValidity("date",!0),null;var t=angular.isDate(e)?e:m.parse(e,l.$dateValue);return!t||isNaN(t.getTime())?void l.$setValidity("date",!1):(u(t),"string"===d.timeType?g(t,d.modelTimeFormat||d.timeFormat):"number"===d.timeType?l.$dateValue.getTime():"unix"===d.timeType?l.$dateValue.getTime()/1e3:"iso"===d.timeType?l.$dateValue.toISOString():new Date(l.$dateValue))}),l.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===d.timeType?m.parse(e,null,d.modelTimeFormat):new Date("unix"===d.timeType?1e3*e:e),l.$dateValue=t,c()}),l.$render=function(){t.val(c())},e.$on("$destroy",function(){f&&f.destroy(),d=null,f=null})}}}]),angular.module("mgcrea.ngStrap.tooltip",["mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var e=this.defaults={animation:"am-fade",customClass:"",prefixClass:"tooltip",prefixEvent:"tooltip",container:!1,target:!1,placement:"top",template:"tooltip/tooltip.tpl.html",contentTemplate:!1,trigger:"hover focus",keyboard:!1,html:!1,show:!1,title:"",type:"",delay:0,autoClose:!1,bsEnabled:!0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","$sce","dimensions","$$rAF","$timeout",function(n,a,o,i,r,s,l,u,c,d,f){function p(n,i){function r(){O.$emit(P.prefixEvent+".show",F)}function s(){if(O.$emit(P.prefixEvent+".hide",F),R===W){if(U&&"focus"===P.trigger)return n[0].blur();A()}}function p(){var e=P.trigger.split(" ");angular.forEach(e,function(e){"click"===e?n.on("click",F.toggle):"manual"!==e&&(n.on("hover"===e?"mouseenter":"focus",F.enter),n.on("hover"===e?"mouseleave":"blur",F.leave),"button"===V&&"hover"!==e&&n.on(v?"touchstart":"mousedown",F.$onFocusElementMouseDown))})}function b(){for(var e=P.trigger.split(" "),t=e.length;t--;){var a=e[t];"click"===a?n.off("click",F.toggle):"manual"!==a&&(n.off("hover"===a?"mouseenter":"focus",F.enter),n.off("hover"===a?"mouseleave":"blur",F.leave),"button"===V&&"hover"!==a&&n.off(v?"touchstart":"mousedown",F.$onFocusElementMouseDown))}}function D(){"focus"!==P.trigger?R.on("keyup",F.$onKeyUp):n.on("keyup",F.$onFocusKeyUp)}function k(){"focus"!==P.trigger?R.off("keyup",F.$onKeyUp):n.off("keyup",F.$onFocusKeyUp)}function T(){f(function(){R.on("click",x),w.on("click",F.hide),j=!0},0,!1)}function S(){j&&(R.off("click",x),w.off("click",F.hide),j=!1)}function x(e){e.stopPropagation()}function C(e){e=e||P.target||n;var t=e[0],a=t.getBoundingClientRect();null===a.width&&(a=angular.extend({},a,{width:a.right-a.left,height:a.bottom-a.top}));var o;return o="body"===P.container?c.offset(t):c.position(t),angular.extend({},a,o)}function M(e,t,n,a){var o,i=e.split("-");switch(i[0]){case"right":o={top:t.top+t.height/2-a/2,left:t.left+t.width};break;case"bottom":o={top:t.top+t.height,left:t.left+t.width/2-n/2};break;case"left":o={top:t.top+t.height/2-a/2,left:t.left-n};break;default:o={top:t.top-a,left:t.left+t.width/2-n/2}}if(!i[1])return o;if("top"===i[0]||"bottom"===i[0])switch(i[1]){case"left":o.left=t.left;break;case"right":o.left=t.left+t.width-n}else if("left"===i[0]||"right"===i[0])switch(i[1]){case"top":o.top=t.top-a;break;case"bottom":o.top=t.top+t.height}return o}function E(e,t){R.css({top:e+"px",left:t+"px"})}function A(){clearTimeout(H),F.$isShown&&null!==R&&(P.autoClose&&S(),P.keyboard&&k()),K&&(K.$destroy(),K=null),R&&(R.remove(),R=F.$element=null)}var F={},V=n[0].nodeName.toLowerCase(),P=F.$options=angular.extend({},e,i);F.$promise=$(P.template);var O=F.$scope=P.scope&&P.scope.$new()||a.$new();if(P.delay&&angular.isString(P.delay)){var I=P.delay.split(",").map(parseFloat);P.delay=I.length>1?{show:I[0],hide:I[1]}:I[0]}F.$id=P.id||n.attr("id")||"",P.title&&(O.title=u.trustAsHtml(P.title)),O.$setEnabled=function(e){O.$$postDigest(function(){F.setEnabled(e)})},O.$hide=function(){O.$$postDigest(function(){F.hide()})},O.$show=function(){O.$$postDigest(function(){F.show()})},O.$toggle=function(){O.$$postDigest(function(){F.toggle()})},F.$isShown=O.$isShown=!1;var H,N;P.contentTemplate&&(F.$promise=F.$promise.then(function(e){var t=angular.element(e);return $(P.contentTemplate).then(function(e){var n=m('[ng-bind="content"]',t[0]);return n.length||(n=m('[ng-bind="title"]',t[0])),n.removeAttr("ng-bind").html(e),t[0].outerHTML})}));var L,R,q,Y,K;F.$promise.then(function(e){angular.isObject(e)&&(e=e.data),P.html&&(e=e.replace(y,'ng-bind-html="')),e=h.apply(e),q=e,L=o(e),F.init()}),F.init=function(){P.delay&&angular.isNumber(P.delay)&&(P.delay={show:P.delay,hide:P.delay}),"self"===P.container?Y=n:angular.isElement(P.container)?Y=P.container:P.container&&(Y=m(P.container)),p(),P.target&&(P.target=angular.isElement(P.target)?P.target:m(P.target)),P.show&&O.$$postDigest(function(){"focus"===P.trigger?n[0].focus():F.show()})},F.destroy=function(){b(),A(),O.$destroy()},F.enter=function(){return clearTimeout(H),N="in",P.delay&&P.delay.show?void(H=setTimeout(function(){"in"===N&&F.show()},P.delay.show)):F.show()},F.show=function(){if(P.bsEnabled&&!F.$isShown){O.$emit(P.prefixEvent+".show.before",F);var e,t;P.container?(e=Y,t=Y[0].lastChild?angular.element(Y[0].lastChild):null):(e=null,t=n),R&&A(),K=F.$scope.$new(),R=F.$element=L(K,function(){}),R.css({top:"-9999px",left:"-9999px",display:"block",visibility:"hidden"}),P.animation&&R.addClass(P.animation),P.type&&R.addClass(P.prefixClass+"-"+P.type),P.customClass&&R.addClass(P.customClass);var a=l.enter(R,e,t,r);a&&a.then&&a.then(r),F.$isShown=O.$isShown=!0,g(O),d(function(){F.$applyPlacement(),R&&R.css({visibility:"visible"})}),P.keyboard&&("focus"!==P.trigger&&F.focus(),D()),P.autoClose&&T()}},F.leave=function(){return clearTimeout(H),N="out",P.delay&&P.delay.hide?void(H=setTimeout(function(){"out"===N&&F.hide()},P.delay.hide)):F.hide()};var U,W;F.hide=function(e){if(F.$isShown){O.$emit(P.prefixEvent+".hide.before",F),U=e,W=R;var t=l.leave(R,s);t&&t.then&&t.then(s),F.$isShown=O.$isShown=!1,g(O),P.keyboard&&null!==R&&k(),P.autoClose&&null!==R&&S()}},F.toggle=function(){F.$isShown?F.leave():F.enter()},F.focus=function(){R[0].focus()},F.setEnabled=function(e){P.bsEnabled=e},F.$applyPlacement=function(){if(R){var a=P.placement,o=/\s?auto?\s?/i,i=o.test(a);i&&(a=a.replace(o,"")||e.placement),R.addClass(P.placement);var r=C(),s=R.prop("offsetWidth"),l=R.prop("offsetHeight");if(i){var u=a,c=P.container?angular.element(t.querySelector(P.container)):n.parent(),d=C(c);u.indexOf("bottom")>=0&&r.bottom+l>d.bottom?a=u.replace("bottom","top"):u.indexOf("top")>=0&&r.top-ld.width?a="right"===u?"left":a.replace("left","right"):("left"===u||"bottom-right"===u||"top-right"===u)&&r.left-s=e.length&&(u.$activeIndex=0)},r.activate=function(e){u.$activeIndex=e},r.select=function(e){var t=u.$matches[e].value;n.$setViewValue(t),n.$render(),u.$resetMatches(),l&&l.$digest(),u.$emit(s.prefixEvent+".select",t,e,r)},r.$isVisible=function(){return s.minLength&&n?u.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=s.minLength:!!u.$matches.length},r.$getIndex=function(e){var t=u.$matches.length,n=t;if(t){for(n=t;n--&&u.$matches[n].value!==e;);if(!(0>n))return n}},r.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},r.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(r.$isVisible()&&(e.preventDefault(),e.stopPropagation()),13===e.keyCode&&u.$matches.length?r.select(u.$activeIndex):38===e.keyCode&&u.$activeIndex>0?u.$activeIndex--:40===e.keyCode&&u.$activeIndex0)return void s.$setViewValue(s.$viewValue.substring(0,s.$viewValue.length-1));e.length>c&&(e=e.slice(0,c));var n=g.$isVisible();n&&g.update(e),(1!==e.length||e[0].value!==t)&&(!n&&g.update(e),s.$render())})}),s.$formatters.push(function(e){var t=p.displayValue(e);return t===n?"":t}),s.$render=function(){if(s.$isEmpty(s.$viewValue))return t.val("");var e=g.$getIndex(s.$modelValue),n=angular.isDefined(e)?g.$scope.$matches[e].label:s.$viewValue;n=angular.isObject(n)?p.displayValue(n):n,t.val(n?n.toString().replace(/<(?:.|\n)*?>/gm,"").trim():"")},e.$on("$destroy",function(){g&&g.destroy(),l=null,g=null})}}}])}(window,document); -//# sourceMappingURL=angular-strap.min.js.map \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.min.js.map b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.min.js.map deleted file mode 100644 index 94d507af..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["module.js","affix/affix.js","alert/alert.js","aside/aside.js","button/button.js","collapse/collapse.js","datepicker/datepicker.js","dropdown/dropdown.js","helpers/date-formatter.js","helpers/date-parser.js","helpers/debounce.js","helpers/dimensions.js","helpers/parse-options.js","helpers/raf.js","modal/modal.js","navbar/navbar.js","popover/popover.js","select/select.js","tab/tab.js","scrollspy/scrollspy.js","timepicker/timepicker.js","tooltip/tooltip.js","typeahead/typeahead.js"],"names":[],"mappings":"UAOE,EAAA,EAAA,wBAGA,OAAA,kBACA,uBACA,uBACA,uBACA,wBACA,wBACA,4BACA,6ECjBF,mDAEA,sIAQI,OAAK,wBAAA,oCAAyB,6CAExB,SAAS,gCAGb,UAAS,6FAwKH,GAAO,EAAA,EAAA,MAEP,GAAO,MACF,oDAMe,OAAf,GAAe,EAAA,IAAA,EAAA,GAAA,EAAA,EACf,kBAOT,QAAO,KACP,MAAO,GAAA,KAAA,EAAA,EAAA,YAAA,EAAA,GAAA,uBAIT,MAAO,GAAA,KAAA,EAAA,EAAA,SAAA,KAAA,aAAA,EAAA,GAAA,gBApLD,MAGA,EAAA,QAAY,UAAA,EAAA,GACZ,EAAA,EAAe,wCAIf,GAAS,MAET,EAAQ,EACV,EAAY,EACV,EAAa,IACX,cAGC,EAAA,iGAKP,EAAc,EAAA,aAIZ,GAAW,QAAC,QAAW,EAAM,uBAI7B,KAAY,kMAaZ,KAAA,gBACA,KAAA,qIASA,EAAA,IAAW,SAAO,KAAA,qBAIpB,EAAO,2BAA2B,WAIhC,WAAI,EAAW,cAAkB,MAI7B,cAAQ,WAGZ,GAAG,GAAY,IACf,EAAU,EAAA,OAAA,EAAA,+BAOR,KAAY,MACT,IAGH,YAAY,GAAO,SAAA,SAAA,WAAA,EAAA,IAAA,EAAA,KAEf,QAAJ,KACE,2EAKA,IAAQ,MAAS,mBAGjB,EADC,EAAA,cACoB,EAAb,EAAI,aAKN,EAAA,IAAA,EAEN,qBAGF,EAAQ,IAAI,WAAO,EAAkB,aAAA,GAAA,oFAKzC,EAAO,IAAA,QAAY,EAAW,GAAA,YAAA,MAE5B,EAAO,IAAA,WAAA,uDAOP,EAAA,qCAGK,mBAAQ,EAAsB,EAAA,UAAA,kCAGjC,GAAW,EAAgB,IAAA,cAEtB,IAAA,WAAQ,EAAc,aAAA,GAAA,0BAGpB,WAAA,cACH,UAAY,wCAGX,GAAA,EAAA,YACH,EAAA,8CAIO,EAAc,OAAA,EAAA,IAAA,IAAA,EAAA,IAAA,EAAA,GAAA,aAAA,GAAA,EAAA,EAAA,6CAWzB,oDAAY,KAAY,EAAA,OAAA,EAAA,IAAA,IAAA,EAAA,OAAA,EAAA,KAAA,EAAA,EAAA,aAAA,oBAQxB,EAAI,IAAA,WAAe,kBA9JrB,GAAI,QAAU,QAAQ,EAAW,SAAU,MAC3C,EAAI,QAAW,QAAQ,EAgM3B,OAAO,iBAMH,WAAiB,SAAA,UAAa,SAAgB,EAAA,iCAI1C,uBACJ,SAAsB,EAAA,EAAW,EAAA,MAE/B,IAAU,MAAA,EAAA,UAAA,OAAA,OAAA,EAAA,EAAA,SAAA,QAAA,QAAA,YACV,SAAQ,YAAA,eAAA,eAAA,eAAA,SAAA,yGAQf,EAAU,wHC7NP,OAAA,wBAAW,kCAEX,SAAW,cAEX,GAAU,KAAA,UACV,UAAU,UACV,YAAM,4BAEN,UAAU,KACV,SAAM,uBACN,WAAA,2BAGF,UAAK,4BAIG,6EAQJ,GAAA,wCAQE,OAAO,cAAkB,EAAA,cACvB,SACA,OAAS,KAAA,EAAW,uCAMxB,EAAO,KAAA,sCAIF,IAAA,EAAA,cAQT,MAAI,sEAQsB,EAAO,uBAAwB,EAAA,kEAQjD,IAAM,MAAY,EAAA,QAAY,EAAA,MAAA,0KAM7B,SAAQ,QAAS,UAAW,QAAA,SAAA,KAC7B,IAAQ,EAAO,SAAO,EAAA,SAAA,KACjB,GAAA,EAAA,YAAA,iDAML,QAAQ,SAAO,uBAGnB,EAAQ,QAAQ,UAKd,GAAU,EAAA,iEAOf,GAAA,EAAA,UChHL,EAAA,2BAUM,OAAA,wBAAW,kCAEX,SAAA,cAEA,GAAS,KAAA,UACT,UAAU,0BACV,YAAU,QACV,YAAM,QACN,UAAM,2DAGR,WAAK,eAEH,UAAS,oBAEH,kEAWN,EAAO,QAAA,UAAA,EAAA,iBAQT,MAAI,sEAQiB,EAAY,uBAAmB,EAAa,+CAK7D,SAAiB,EAAS,EAAY,MAElC,IAAM,MAAY,EAAA,QAAY,EAAA,MAAA,8KAM7B,SAAQ,QAAS,WAAW,SAAA,KAC7B,IAAQ,EAAO,SAAO,EAAA,SAAA,KACjB,GAAA,EAAA,YAAA,iDAML,QAAQ,SAAO,uBAGnB,EAAQ,QAAQ,UAKd,GAAU,EAAA,iEAOf,GAAA,EAAA,UCxFL,EAAA,uEAYM,UAAQ,yEAOV,MAAA,KAAO,WACL,OAAA,SAAU,gBAKJ,kBAAmB,2BAGrB,YACA,+NAQP,EAAU,KAAA,WAAA,EAAA,QAAc,IAAA,EAAS,KAAS,0BAQjC,cAAS,UAAgB,QAAS,SAAM,EAAY,MAExD,GAAI,EAAU,gDAIV,2BAEA,SAAY,EAAQ,EAAU,EAAK,MAErC,GAAY,EAGX,EAA8B,UAA9B,EAAA,GAAoB,SACrB,EAAa,EAAY,EAAK,SAAA,wEAIhC,EAAI,EAAA,MAAkB,EAAO,eAE3B,GAAW,QAAS,UAAK,EAAS,YAAW,EAAA,YAAA,2BAEpC,EAAA,MAAY,EAAA,4FAQrB,MAAM,GAAY,EAAS,gEAQ3B,EAAI,OAAA,EAAW,QAAQ,WACvB,EAAM,kCAOR,GAAA,GAAa,QAAQ,OAAA,EAAa,YAAW,EAC3C,GAAM,+BAEJ,EAAa,YAAA,EAAA,YAAA,sIAuBb,eAAW,2BAGb,6NAQP,QAAU,QAAA,GAAA,KAAA,WAAW,EAAS,yBAQrB,WAAS,UAAS,QAAO,SAAe,EAAA,MAE5C,GAAI,EAAU,gDAIV,2BAEA,SAAQ,EAAA,EAAyB,EAAK,WAKxC,EAA8B,UAA1B,EAAW,GAAQ,SACvB,EAAiB,EAAA,EAAA,SAAA,EAEf,EAAA,EAA0B,KAAA,EAAQ,OAAa,EAAA,MAAA,EAAA,OAAA,EAAA,2BAKnD,GAAA,GAAa,QAAQ,OAAA,EAAa,YAAW,EAC3C,GAAM,+BAEJ,EAAW,YAAc,EAAA,YAAA,6EAShC,EAAA,2BC/JC,OAAA,8DAIF,GAAI,GAAA,KAAa,UACf,UAAW,iDAGX,gBAAgB,EAChB,eAAQ,uDA2EF,GADF,GAAkB,EAAA,SAAY,QAC5B,EAAA,EAAA,EAAc,EAAU,OAAS,0BAOrC,EAAmB,KAAQ,EAAA,SAAY,2CAMhC,GAAS,kEAKX,GAAc,sCAEZ,MAAL,yGAWY,KAAZ,EAAA,SAAY,QAAA,QAAA,IAChB,EAAA,SAAU,QAAW,KAAA,GAvGrB,GAAA,GAAK,IAGL,GAAK,SAAA,QAAA,KAAuB,6GAEvB,QAAA,UAAkB,EAAA,MAAS,EAAS,SAAA,GAAA,EAAA,MAGzC,EAAK,cACH,wCAIA,gBAAiB,SAAS,qDAI5B,EAAK,SAAA,KAAA,oCAIH,GAAA,GAAK,EAAS,SAAO,QAAO,EAE5B,GAAI,SAAK,OAAS,EAAA,MAEhB,kBAAe,SAAA,8BAIjB,GAAA,SAAA,OAAqB,EAAA,GAErB,EAAK,SAAA,oBAMP,EAAc,GAEZ,EAAG,qBAAgB,QAAQ,SAAA,GACzB,kBAKK,QAAA,EAAA,SAAA,mBAAA,KACL,WAAa,EAAA,WAAA,SAAA,yDAIb,EAAA,SAAA,eAIJ,EAAK,sEAQH,eAAoB,WACpB,MAAI,GAAQ,SAAO,cAAc,EAAQ,SAAK,QACd,IAA9B,EAAI,SAAQ,QAAA,OAAkB,EAAA,SAAA,QAAA,GAAA,0BA8CrC,GAAA,0BAEC,EAAI,WAAqB,gFAQjB,EAAiB,8GAKnB,SAAe,EAAA,EAAqB,EAAK,oBAKzC,oFAQQ,YAAgB,KAAA,SAAA,MAEpB,QAAI,QAAQ,gDAQV,SAAA,QAAe,qPAkCT,gBAAM,kJAUzB,EAAU,yBAQD,oBAAiB,WAAY,SAAA,mBAGzB,YAAS,yDAwBN,EAAkB,SAAA,QAAA,GACzB,EAAS,EAAA,oDAGe,KAA1B,EAAS,QAAQ,mBAIjB,IAAA,wDA5BQ,EAAS,QAInB,GAAA,SAAe,YAGf,EAAU,SAAY,WACpB,EAAA,SAAe,EAAA,SAAkB,aAIrB,gBAAe,KAGvB,IAAA,WAAgB,aACP,kBAAoB,KAmBtC,EAAA,qBAAA,KAAA,WCzQL,MAEQ,iBAQF,OAAA,4IAKA,cAAW,cAEX,GAAM,KAAA,UACN,UAAO,mCAEP,UAAW,cACX,SAAU,iCACV,QAAA,QACA,WAAA,EACA,UAAA,EACA,MAAA,EACA,MAAA,EAEA,WAAA,EACA,SAAA,OACA,WAAW,YACX,gBAAU,KACV,UAAU,KACV,YAAW,MACX,WAAS,OACT,iBAAW,YACX,gBAAA,OACA,cAAU,EACV,WAAW,4BAGb,UAAK,YAEH,UAAI,EACJ,mBAAe,GACf,SAAI,mCACJ,UAAI,sPAyJG,OACD,GAAQ,QA9IZ,GAAI,GAAc,EAAA,EAAgB,QAAA,UAAA,EAAA,IAClC,EAAY,EAAS,MACjB,EAAA,EAAW,SACf,EAAM,EAAgB,MACtB,GAAM,YAAY,EAAQ,WAAA,EAAA,oCAM1B,IAAA,GAAM,EAAmB,WACvB,MAAY,EAAO,iCAErB,EAAM,WAAA,EAAc,aAClB,GAAY,EAAY,OAAA,EAAA,oEAQ1B,EAAY,YAAS,MAEhB,YAAe,aAChB,SAAY,EAAQ,MAAA,GAAA,EAAA,OAAA,8BAOxB,QAAY,OAAA,KAAA,MAAsB,EAAA,aAChC,EAAQ,MAAA,EACR,EAAQ,OAAO,KAAI,EAAW,oDAO9B,EAAI,mBAAe,CACnB,KAAI,GAAA,GAAM,EAAA,EAAS,EAAM,KAAA,OAAA,EAAA,EAAA,IACvB,QAAA,QAAW,EAAA,KAAc,GAAA,EAAa,wCAMtC,QAAQ,OAAO,EAAW,cAAW,EAAe,WAAY,GAAA,MAAA,KAChE,EAAA,OAAY,GACZ,EAAA,cAAY,QAAA,KAAA,6DAMd,QAAM,OAAQ,GAAA,KAAA,EAAA,cAAA,MAAA,EAAA,WAAA,KAAA,EAAA,YACd,EAAU,QAAY,EAAA,MAAa,GACnC,EAAY,2CAOZ,EAAG,EAAa,OAAQ,EAAQ,OAChC,EAAG,YAKK,OAAW,SAAM,yHAS3B,QAAY,QAAA,EAAA,KAAiB,GAAA,IAI7B,EAAY,YAAc,SAAS,GACjC,MAAI,GAAQ,WAAQ,iCAIpB,EAAA,SAAI,EAAiB,WAAU,EAAI,+CAQ/B,EAAA,GAAA,MAAA,KAAA,IAAA,EAAA,MAAA,EAAA,MAAA,GAAA,EAAA,EAAA,OAAA,EAAA,OAAA,GAAA,EAAA,0FAEJ,EAAY,YAGR,aAAoB,SAAA,QAEtB,wCAIJ,GAAA,GAAY,QAAa,QAAS,EAAK,OACJ,YAA5B,EAAA,GAAA,SAAmB,gBACpB,EAAA,EAAA,wCAMK,WAAA,SAAA,MACL,mBAAoB,KAAA,EAAA,WAAa,EAAY,WAAQ,EAAM,iEAK/D,MAAA,GAAQ,iDACR,EAAY,MAAA,mCAuBV,GAAQ,EAAK,OACL,KAAG,kCAEb,EAAA,KAAA,OAAA,uDAGE,IACJ,EAAY,KAAA,OAAU,QACpB,EAAG,KAAY,WAAQ,QACrB,EAAQ,GAAA,QAAI,QAEd,MAGF,IAAI,GAAQ,EAAY,OACxB,GAAY,QAAO,WACjB,GAAA,EAAA,4BAGA,QAGE,GAAA,EAAY,OACT,KAAQ,4BAMX,EAAQ,WACZ,EAAY,SAAO,GAAS,EAAM,aAAA,YAAA,EAAA,cAC5B,EAAA,UACJ,EAAY,GAAA,UAAa,EAAU,cAEjC,GAAA,2CAKJ,EAAO,+GAKT,EAAO,UArML,IADI,QAAc,QAAO,EAAA,SAAA,MACrB,8BAAsB,KAAA,EAAA,UAAA,YAC1B,EAAY,eAAY,GAAA,UAAA,CA4M5B,OA3MI,GAAW,OAAA,EAAW,KAAQ,EAAa,iCA2M3C,gBAMI,gBAAkB,UAAO,SAAS,KAAM,iBAAY,cAAA,cAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,MAGxD,eAAI,8BAAqC,KAAA,EAAA,UAAA,mFAqDrC,GAAgB,sBAEZ,qBAeN,GAAG,QAAS,OAAA,GAAZ,qIAIF,GAAW,aAAS,OAAQ,mDAIxB,IAAA,EAAW,WAAqB,YAkElC,2FAxIA,IAAW,MAAS,EAAA,WAAW,WAC/B,SAAa,YAAO,YAAoB,QAAA,UAAW,WAAA,OAAA,YAAA,WAAA,YAAA,WAAA,aAAA,kBAAA,YAAA,eAAA,YAAA,YAAA,YAAA,OAAA,YAAA,UAAA,WAAA,YAAA,qBAAA,MAAA,SAAA,0CAKrD,EAAA,QAAU,EAAW,OAAA,EAAA,OAAA,SAAA,6BAElB,QAAA,SAAY,KAAQ,IAAmB,EAAa,MAAA,0DAKrD,GAAO,EAAe,EAAW,EAAc,gBAGjD,GAAI,EAAa,YAAa,EAAQ,WAAQ,2CAK5C,MAAA,GAAkB,WAAc,EAAK,EAAS,gKAUhD,EAAa,SAAK,GAAS,EAAS,oBAAoB,EAAA,IAErD,MAAA,EAAA,SAAA,KAAA,EAAA,QAAA,yBAMD,OAAO,EAAA,QAAA,yHAcT,EAAS,EAA0B,GAE7B,GACA,EAAA,oBAA8B,OAkBzB,SAAA,QAAA,SAAA,GAGT,IAAI,QACF,GAAW,aAAa,QAAQ,GAI3B,kCAGP,QAAG,GAAQ,MAAa,EAAU,eAChC,GAAO,aAAW,QAAY,MAKd,GAEX,aAAA,SACE,EAAS,EAAW,EAAA,iBAAA,EAAA,wGAKH,QAAjB,EAAA,oCAGN,GAAQ,MAAA,EAAY,iBAKd,YAAW,KAAM,SAAA,MAExB,SAEA,WADK,YAAA,IAAA,OAAA,EACE,mHAQF,6CAcT,EAAU,IAAA,wDAWf,EAAS,qBAQR,kBAA0B,2BAUxB,IADF,GAAA,MACE,EAAS,OAAS,wBAGpB,OAAK,WAIG,GAAA,EAAQ,UACR,EAAA,EAAU,GAAO,EAhBb,KAAA,oBACD,sBAkBP,MAAI,iBAAsB,cAAc,OAAA,SAAA,EAAA,EAAA,qCAKpC,EAAA,EAAc,SAEd,EAAA,EAAA,qBAEJ,MAAI,GAAmB,WAAU,EAAQ,EAAA,IAErC,EAAA,GAAiB,OAAU,EAAA,WAAsB,KAAA,EAAA,OAAA,EAAA,eAEjD,EAAS,EAAA,cAAA,GACT,EAAgB,EAAA,MAAA,EAAA,WAAA,OAAA,EAAA,MAAA,EAAA,EAAA,YAChB,EAAO,EAAA,YAAA,+BAAA,EAAA,KAAA,qCAAA,SAEP,EAAQ,EAAS,QAAM,EAAO,UAAA,EAAA,oBAAA,YAAA,EAAA,WAAA,GAAA,UACnB,KAAA,EAAS,cAAc,MAAA,EAAkB,WAAiB,KAAK,EAAA,cACzB,IAArC,EAAO,6BAGf,EAAS,gBACT,wCAGJ,KAAO,OAAW,GAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,OAChB,QAAI,OAAA,GAAsB,KAAK,EAAS,MAAM,cAAgB,MAAI,EAAA,MAAA,WAAwB,KAAA,EAAgB,MAAA,YAC1G,EAAI,UACA,EAAQ,YAAW,EAAA,gCAEvB,EAAG,0BAGD,cACA,GAAiB,GAAK,MAAA,EAAa,KAAA,EAAA,MAAmB,GAAO,EAAuB,EAAc,6FAEpG,GAAM,GAAQ,OAAA,cAEd,KAAe,IAAA,EAAA,GAAA,OAAA,EAAA,KAAA,EAAA,IAEf,KAAA,GADa,GAAb,KACK,EAAA,EAAQ,GAAA,EAAA,mFAEf,EAAA,MAAY,KAAS,EAAA,QAAM,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,QAAA,SAAA,EAAA,OAAA,KAAA,WAAA,GAAA,MAAA,EAAA,aAAA,EAAA,MAAA,SAAA,KAAA,WAAA,qCAG3B,EAAA,YAAqB,EACnB,EAAI,OAAO,wOAWP,EAAI,EAAQ,SAAQ,EAAA,EAAmB,QAAG,OAAS,2DAMvD,IAAA,EAAO,iEAET,GAAA,GAAW,EAAc,mBAAA,GAAA,OAAA,GAAA,EAAA,mBAAA,GAAA,IAClB,OAAO,sBAOJ,SAAI,MACP,EAAO,OAGZ,MAAI,EAAM,EAAW,MAAA,SAGjB,MAAN,EAAM,QAAA,EAAA,GAAA,MAAA,EAAA,OACU,KAAR,EAAA,QAAQ,EAAA,GAAA,MAAA,EAAA,QACT,KAAA,EAAA,QAAA,EAAA,GAAA,MAAA,EAAA,OACQ,KAAN,EAAA,UAAM,EAAA,GAAA,MAAA,EAAA,SAET,KAAK,WAAS,IAAK,EAAA,OAAkB,GAAS,2BAIhD,EAAQ,kBACR,oCAGJ,KAAO,OAAW,EAAA,gBAAA,EAAA,KAGP,EAAI,aAAgB,EAAA,QAC3B,QAAQ,OAAI,GAAc,MAAM,EAAG,MAAA,WAAA,KAAA,EAAA,MAAA,YACnC,EAAO,oBAJT,QAAI,OAAa,GAAS,KAAA,EAAe,MAAG,cAAA,MAAA,EAAA,MAAA,WAAA,KAAA,EAAA,MAAA,YAC5C,EAAI,iBAMJ,kBAEa,GAAb,GADa,GAAM,MAAA,EAAa,KAAA,EAAA,oBAGlC,EAAY,GAAA,MAAS,EAAM,KAAA,EAAA,GACzB,EAAO,MAAO,KAAA,EAAc,MAAA,EAAkB,EAAO,KAAA,QAAM,SAAiB,EAAK,YAAe,GAAO,SAAM,KAAA,WAAA,IAE/G,GAAA,MAAY,EAAe,EAAA,EAAA,iBACzB,EAAI,YAAY,EAChB,EAAA,KAAO,EAAW,EAAQ,KAAA,iCAGrB,SAAc,SACjB,GAAA,OAAA,EAAA,gBAAA,EAAA,MAAA,eAAA,EAAA,aAAA,EAAA,MAAA,uBAEE,SAAc,GAClB,GAAI,IAAU,GAAI,MAAK,EAAO,cAAA,EAAA,WAAA,EAAA,wDAGtB,SAAI,MACP,EAAO,OAGZ,GAAI,GAAM,EAAW,MAAU,8BAG3B,MAAN,EAAM,QAAA,EAAA,SAAA,EAAA,GACU,KAAR,EAAA,QAAQ,EAAA,SAAA,EAAA,GACT,KAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GACQ,KAAN,EAAA,SAAM,EAAA,SAAA,EAAA,GAET,KAAK,WAAS,IAAS,EAAS,OAAK,GAAA,0BAIvC,EAAQ,iBACR,wCAGJ,KAAO,OAAW,GAAA,SAAA,EAAA,cAAA,GAAA,MAAA,SAAA,EAAA,KAAA,GAAA,KAChB,QAAI,OAAY,GAAS,KAAO,EAAS,MAAA,cAAqB,MAAA,EAAA,MAAA,WAAA,KAAA,EAAA,MAAA,YAC9D,EAAI,UACK,EAAI,gBAAgB,EAAA,OAC3B,QAAO,OAAI,GAAK,KAAe,EAAG,MAAA,cAAA,MAAA,EAAA,MAAA,WAAA,KAAA,EAAA,MAAA,YAClC,EAAM,0BAGR,kBAEa,GADb,EAAa,EAAM,KAAY,EAAA,MAAA,EAAA,KAAA,OAC/B,kBAEF,EAAA,GAAY,MAAA,EAAe,EAAA,EAAA,GACzB,EAAO,MAAO,KAAA,EAAS,MAAK,EAAA,EAAkB,KAAO,QAAM,SAAA,EAAA,YAAA,GAAA,SAAA,KAAA,WAAA,IAE7D,GAAA,MAAY,EAAS,GAAA,MAAM,IAAA,EAAA,EAAA,OAAA,GAAA,MACzB,EAAI,YAAY,EAChB,EAAA,KAAO,EAAW,EAAQ,KAAA,iCAGrB,SAAc,SACjB,GAAA,OAAA,EAAA,gBAAA,EAAA,MAAA,0BAEE,SAAa,MACb,IAAU,GAAI,MAAK,EAAO,cAAA,EAAA,EAAA,wDAGtB,SAAI,MACP,EAAO,OAGZ,GAAI,GAAM,EAAW,MAAA,gEAIpB,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,GACoB,KAAlB,EAAQ,QAAgB,EAAA,QAAgB,EAAY,GACjD,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,kDAOf,MAAA,EAAA,QAAA,MAAA,UAAA,MAAA,KAAA,EAAA,EAAA,SAAA,ECxnBL,SAAA,gBAUM,OAAA,2BAAU,oCAEV,YAAW,cAEX,GAAM,KAAA,UACN,UAAO,yDAGT,SAAK,6CAEH,WAAI,EACJ,UAAI,UAEJ,MAAA,qFAQE,GAAqB,EAAS,iBAkEhC,MAAO,GAAA,SAAA,EAAA,6BAAP,iBA7DE,EAAU,QAAA,UAAsB,EAAK,EAC9B,GAAe,OAAI,EAAU,OAAA,EAAA,MAAA,QAAA,EAAA,SAE9B,EAAA,EAAA,sBAKA,WAAA,SAAA,GACJ,GAAA,UAAQ,KAAQ,EAAO,SAAvB,GACE,oCAIF,IAAG,GAAI,QAAY,QAAM,EAAW,SAAA,GAAA,iBAAA,4BAC5B,aAER,SAAM,QAAU,EAAG,SAAA,EAAA,0DAMA,KAAjB,EAAO,SAAU,EAAA,EAAA,OAAA,EAAA,IACX,QAAO,YAAW,KAAA,EAAA,GAC1B,EAAA,GAAA,GAAA,GAAA,iBAMM,EAAA,OACN,KAAS,eAIX,EAAU,WACR,EAAI,UAAU,EAAU,SAAA,GAAA,UAAA,EAAA,YACxB,EAAQ,GAAA,QAAY,IACpB,GAAA,GACA,EAAS,SAAS,aAAe,EAAS,SAAA,qBAI5C,GAAI,KAAU,WACd,EAAU,WACR,EAAO,UAAa,EAAA,SAAA,IAAA,UAAA,EAAA,YACpB,EAAA,IAAA,QAAA,sDAKF,IAAA,GAAS,EAAY,iBACZ,QAAW,WAClB,EAAO,IAAI,QAAA,aA9Db,GAAI,QAAU,QAAQ,EAAW,SAAU,MAC3C,EAAY,QAAU,UAAS,iBAAyB,QAAM,UAAU,uBAAW,QAAA,UAAA,oBAAA,QAAA,UAAA,mBAAA,QAAA,UAAA,gBA4EvF,OAAO,iBAMC,cAAW,UAAO,OAAA,YAAA,SAAA,EAAA,EAAA,0DAQnB,IAAA,MAAA,kKAMD,YAAa,EAAO,OAAS,EAAA,WAAkB,SAAA,sFAOjD,QAAU,SAAY,KAAW,IAAA,EAAA,MAAA,yBAC/B,KAAI,EAAU,EAAS,OAAA,EAAA,mDAQ5B,GAAA,EAAA,UC7IL,EAAA,qFAYM,kBAAe,UAAA,aAAA,SAAA,EAAA,kHAajB,KAAA,kBAAyB,SAAQ,GAC/B,MAAO,GAAA,iBAAA,IAAiC,iCAI1C,MAAK,GAAA,iBAAuB,qIAmB5B,MAAK,GAAa,GAAe,SAIhC,OAAA,SAAA,GCrDL,QAAA,EAAA,GAAA,kCAIC,MAAS,GAAA,EAAA,eAMN,OAAK,iDAEA,eAAQ,kBAAA,uCAMf,KAAA,MAAU,EACV,KAAA,IAAU,EACV,KAAA,MAAU,EACV,KAAA,QAAU,EACV,KAAA,QAAU,EACV,KAAA,aAAoB,UA4Bd,oBAIJ,OAAQ,MAAA,WAAA,KAAA,SAAA,GAGV,QAAI,GAA2B,EAAA,GAE7B,IAAA,GADA,GAAQ,EAAA,OAAA,EAAA,EAAA,WAAA,cACA,EAAA,EAAA,EAAA,EAAA,sCAGV,OAAK,GArCL,EAAU,UAAU,gBAAW,SAAgB,GAAA,KAAA,aAAA,KACxC,UAAa,WAAA,SAAA,GAAA,KAAA,QAAA,KACb,UAAQ,WAAM,SAAA,GAAA,KAAA,QAAA,KACd,UAAY,SAAA,SAAA,GAAA,KAAA,MAAA,KACZ,UAAQ,SAAM,WAAA,MAAA,MAAA,SACd,UAAU,QAAM,SAAA,GAAA,KAAA,IAAA,KAChB,UAAU,SAAM,SAAA,GAAA,KAAA,MAAA,KAChB,UAAA,YAAqB,SAAA,GAAA,KAAA,KAAA,KACnB,UAAA,SAAA,SAAA,4DAGT,KAAA,IAAU,EAAA,UACR,KAAA,MAAW,EAAK,mEAGlB,KAAI,aAAkB,EAAA,sDAKtB,MAAS,IAAA,MAAA,KAAa,KAAA,KAAA,MAAA,KAAA,IAAA,KAAA,MAAA,KAAA,QAAA,KAAA,QAAA,KAAA,yDAqBd,4BAIJ,MAAI,UAAY,aAAA,SAAA,EAAA,MAEd,GAAU,SAAA,WAmJN,GAAgB,MACM,GAAtB,EAAG,OAAS,KAAK,QACX,2DAKV,GAAQ,GAAQ,EAAK,OAAY,EAAA,uCAG5B,EAAG,GAAU,EAAK,EAAA,KAUvB,MALF,SAAS,QAAA,EAAA,SAAsB,kBAKzB,gBAIJ,MAAI,GAAO,QAAS,MAAA,SAAa,QAAA,OAAA,OAAA,QAAA,MAAA,OAAA,QAAA,OAAA,uBAIjC,GAAiC,GAA7B,EAAO,OAAI,KAAK,8BAKpB,EAAO,EAAA,MAAI,EAAO,IAAM,KAAK,KAAM,EAAA,IAGrC,KAAA,EAAA,EAAY,EAAA,EAAA,OAAA,IACZ,EAAO,EAAA,MAAA,KAAA,EAAA,KAAA,KAAA,IAAA,EAAA,EAAA,IAAA,IAIT,eAAO,GAAA,QAAA,IAAA,EAAA,KAAA,SAtIL,GAAA,EApDE,EAAU,QAAA,UAAA,EAAA,GAEV,KAEA,GACA,IAAU,WACV,GAAU,aACV,EAAU,EAAQ,OAAA,cAAqB,mBACvC,GAAU,aACV,EAAU,EAAA,OAAA,cAAA,mBACV,GAAU,mBACV,EAAU,EAAQ,OAAA,iBAA4B,oBAC9C,GAAU,oBACV,EAAU,EAAA,OAAA,eAAA,iBACV,EAAU,QACV,KAAU,EAAA,iBAAA,IAAA,KAAA,KACV,IAAU,EAAA,iBAAA,SAAA,KAAA,KACV,GAAU,gIAGZ,IAAI,EAAW,iBAAA,WAAA,KAAA,KACb,GAAU,gBACV,EAAU,EAAM,OAAA,eAAA,iBAChB,KAAU,gCACV,GAAU,WACV,EAAU,EAAM,OAAA,wBAAA,kBAGhB,GACA,IAAU,EAAM,gBAChB,GAAU,EAAA,WACV,EAAU,EAAA,WACV,GAAU,EAAM,WAChB,EAAU,EAAM,WAChB,GAAU,EAAA,SACV,EAAU,EAAA,SACV,GAAU,EAAA,SACV,EAAU,EAAA,SACV,KAAU,EACV,IAAU,EACV,GAAU,EAAA,QACV,EAAU,EAAM,kKAGlB,IAAW,SAAA,GAAA,MAAA,MAAA,SAAA,EAAA,EAAA,iBAAA,WAAA,iDAEX,EAAY,SAAO,GAAW,MAAA,MAAA,SAAA,EAAA,EAAA,IAC5B,KAAA,EAAY,YACZ,GAAQ,SAAA,GAAgB,MAAA,MAAY,YAAA,IAAA,EAAA,IACpC,EAAS,EAAA,YA6Id,UAxIY,KAAM,2EAGf,EAAA,EAAoB,EAAgB,YAG/B,QAAe,SAAQ,GAC1B,MAAA,SAAI,OAAc,IAAS,MAAA,EAAgB,WACvC,EAAA,KAAA,4BAKJ,IAAQ,EAAW,EAAQ,iBAAiB,IAAA,GAC1C,QAAA,OAAa,KAAM,EAAa,EAAQ,EAAM,GAAU,EAAA,oCAGtD,EAAU,EAAK,KAAA,sBAIjB,GADE,IAA8C,GAAA,IAAA,SAA9C,IAAmB,MAAA,EAAgB,WAAW,EAAA,GAAA,MAAA,KAAA,EAAA,EAAA,IAChD,EAAO,EAAA,EAAA,EAAA,OAAA,EAAA,8CAOT,OAAI,UAAA,EAAA,IAAA,MAAA,EAAA,aAIF,KAGQ,oBAAkB,SAAA,EAAA,MAC1B,MAEO,UAAP,EAAe,OACV,GAAA,KACL,GAAO,GAAI,MAAK,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,YAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,YAAA,EAAA,EAAA,mFAGX,EAAA,8DAGG,YAAZ,GAAY,KAA+B,sBAKlC,MAGE,oBAAkB,SAAY,EAAA,eAIrC,GADK,WACE,GAAA,OAAA,YAAkB,KAAW,EAAA,iGAG/B,EAAA,0LAwBP,EAAI,SAAU,EAAA,WAAY,GAAA,EAAA,WAAA,EAAA,MAFnB,eAqDZ,yBC/PG,OAAI,8CAIF,YAAS,WAAO,SAAA,6BAElB,GAAU,WACR,eACA,GAAI,OACG,iBAcd,OAZQ,IACH,EAAG,OAAS,kBAGZ,EAAO,4CAQJ,eAQD,YAAW,WAAY,SAAO,mBACvB,EAAM,EAAS,yBAEtB,MACE,cACA,GAAG,OACD,cAED,EAAM,WAAA,+BAId,EAAA,KCrDH,EAAA,YAAA,2IAcI,GACE,IADE,QAAc,4HAmBhB,GAAA,+dAoCE,GAAiB,IAAA,EAAA,KAAA,SAKK,UAAtB,EAAA,IAAA,EAAA,YAGA,EAAS,EAAG,2EAcZ,EAAY,KAAM,EAAA,IAAA,EAA8B,kBAAsB,GACtE,EAAa,MAAO,EAAA,IAAA,EAA+B,mBAAS,qmBC1FpE,ODgJI,yDClJJ,GAAA,EAAA,IAAA,EAAA,eAAA,GAAA,EAAA,IAAA,EAAA,gBAAA,GAAA,EAAA,IAAA,EAAA,mBAAA,GAAA,EAAA,IAAA,EAAA,oBAAA,GAEQ,gBAQJ,OAAK,mDAEH,gBAAS,cAEP,GAAI,KAAA,sMAIJ,MAAA,SAAc,KAAU,SAAA,EAAA,8DAyCxB,GAAc,GAAA,EAAd,WACA,GAAO,GAAA,yDAnCL,EAAY,QAAO,UAAY,EAAM,KACzB,cAGZ,GAAA,EAAiB,EAAW,EAAW,EAAA,EAAA,CAuC5C,uDAnCG,EAAc,EAAA,EAAW,IAAA,EAAS,IAChC,EAAU,EAAK,IAAS,EAAA,KAClB,EAAS,KACb,EAAc,EAAA,IAAU,MACjB,EAAA,EAAc,GAAA,EAAA,GAAA,cAIzB,EAAc,SAAA,SAAe,EAAS,GACpC,MAAI,GAAA,KAAQ,EAAA,EAAA,IACZ,KAAM,SAAA,SACN,GAAO,QAAU,EAAA,EAAA,EAAA;IAKnB,EAAS,aAAoB,SAAO,GAClC,GAAA,eACM,GAAa,EACjB,EAAO,aAgBd,uBC1DC,QAAA,MAAA,GAAuB,QAAQ,QAAA,IAAA,IAAA,QAAA,OAAA,iCAER,WAAQ,SAAA,EAAA,kCAGd,EAAA,6BACX,EAAA,yBAEN,EAAS,EAAsB,sBACb,EAAA,4BACK,EAAA,6DAGzB,IAAa,EACX,EAAI,WACG,MACL,GAAA,EAAgB,wCAMtB,GAAO,GAAA,EAAA,EAAA,OAAA,qBAEN,EAAA,OAAA,uCCxBG,OAAA,wBAAa,+CAEb,SAAU,cAEV,GAAW,KAAA,UACX,UAAS,UACT,kBAAU,UACV,YAAU,QACV,YAAM,QACN,UAAM,yDAGR,WAAK,eAEH,UAAI,EACJ,UAAI,EACJ,MAAI,EACJ,MAAI,QAGJ,MAAS,UAAa,aAAQ,WAAA,KAAA,iBAAA,QAAA,WAAA,WAAA,OAAA,aAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,WAQxB,GAAQ,WAiKR,sCAgCJ,QAAO,sCAEL,EAAO,YAAW,EAAO,YAAgB,sFA8B3C,EAAO,SAAA,EAAA,gKA1NP,IAAA,GAAO,EAAM,OAAc,EAAQ,OAAA,EAAW,MAAQ,QAAa,EAAS,oDAQ5E,EAAM,IAAA,EAAQ,IAAW,EAAA,SAAA,EAAA,QAAA,KAAA,OAAA,qHAUzB,EAAM,wFASN,EAAG,aAAQ,WACT,EAAO,cAIH,SAAI,EAAY,UAAY,IAG5B,gMAQN,OADI,GAAA,UAAkB,EAAQ,OAAQ,SAC/B,EAAc,GAAA,4FAQrB,GAAO,SAAO,KAAA,SAAW,6EAGvB,EAAW,EAAA,MAAM,KACT,EAAa,KACjB,2BAMN,EAAO,8CAQH,QAAA,0BAKF,EAAM,qBAIR,EAAc,QAIV,cAIA,KAAS,eACT,EAAQ,WAER,EAAI,MAAQ,EAAA,YAAW,eAAA,GAAA,wBAGhB,UACL,UAAS,EAAA,cACT,EAAQ,mHAKZ,EAAA,EAAe,GAAO,UAAW,QAAA,QAAY,EAAO,GAAA,WAAS,cAG7D,EAAA,EAAkB,WAKd,EAAgB,SAAS,EAAQ,EAAA,6DAMnC,EAAS,wDAIX,EAAc,SAAS,EAAM,YAG7B,EAAO,UACP,EAAW,MAAA,EAAA,EAAA,KAIX,IAAA,GAAA,EAAsB,MAAA,EAAW,EAAA,EAAA,EAC/B,IAAG,EAAA,MAAA,EAAA,KAAA,4BAGL,EAAA,yCAQE,SAAmB,EAAA,YAAS,SAC5B,EAAA,uFAOJ,EAAS,GAAA,QAAuB,GAC9B,EAAY,GAAQ,QAAA,gBAGtB,EAAc,GAAA,QAAW,EAAA,8BASvB,GAAG,EAAA,WAEA,EAAA,MAAQ,EAAU,YAAA,eAAA,GAAA,iBAArB,CAGA,GAAA,GAAO,EAAW,MAAM,EAAW,wBAKjC,EAAA,UACA,EAAA,MAAA,4BAGF,EAAW,iCAKb,EAAS,IAAA,QAAuB,GAC9B,EAAY,IAAQ,QAAA,IAEjB,EAAQ,UACT,EAAY,IAAA,QAAY,EAAQ,gEAkB9B,MAAI,aACC,GAAA,2DAQX,EAAS,OACP,EAAG,sBAsBP,QAAI,GAAgB,GACpB,EAAA,SAAS,EAAc,OAAU,EAAA,MAAA,SAAA,EAAA,kBAGzB,GAAS,EAAK,SACf,SAAQ,SAAS,GAAM,GAAA,iBAAA,YAI1B,GAAO,qEAIX,MAAO,SAAA,SAAA,mCAlQL,GAAI,QAAS,wEAGb,EAAc,QAAO,QAAW,EAAQ,SAAO,MAC/C,EAAkB,kBAsQtB,OAAO,iBAMC,WAAW,UAAO,OAAO,SAAS,SAAe,EAAA,EAAA,0DAQjD,IAAM,MAAY,EAAA,QAAY,EAAA,MAAA,mLAM7B,SAAQ,QAAS,WAAW,SAAA,KAC7B,IAAQ,EAAO,SAAO,EAAA,SAAA,KACjB,GAAA,EAAA,YAAA,iDAML,QAAQ,SAAO,uBAGnB,EAAQ,QAAQ,UAKd,GAAU,EAAA,iEAOf,GAAA,EAAA,UCrVL,EAAA,uEAYS,UAAO,4FAQZ,MAAI,KAAA,0GAQA,GAAQ,EAAQ,qDAOd,GAAO,QAAU,KAAA,8CAEhB,QAAS,UAAU,EAAA,MAAU,EAAA,GAAA,EAAA,QAI9B,OAAQ,iBAEF,GAAA,iBAED,uFAMD,GAAU,QAAS,QAAQ,KACtB,EAAA,KAAA,EAAA,WAAA,QAAA,IAAA,MACL,GAAA,kIC3CR,OAAQ,0BAAA,oCAER,WAAU,cAEV,GAAS,KAAA,UACT,UAAU,UACV,YAAM,GACN,WAAO,EACP,QAAA,EACA,UAAO,QACP,SAAA,8DAGF,UAAK,UAEH,MAAA,iCAGM,6CAKD,GAAiB,EAAA,+CAQtB,GAAO,wCAQT,MAAI,6EAQA,GAAsB,EAAA,uBAAA,EAAA,kEAQlB,IAAM,MAAY,WAClB,SAAQ,WAAU,kBAAa,YAAsB,YAAW,SAAA,QAAA,UAAA,WAAA,OAAA,YAAA,cAAA,YAAA,MAAA,SAAA,WAC9D,UAAW,EAAQ,MAAA,EAAA,GAAA,EAAA,uFAMzB,EAAK,GAAA,EAAa,YAAa,GAC7B,QAAG,UAAiB,IAAW,EAAA,WAC7B,GAAQ,EAAO,wEAOhB,QAAA,SAAA,uBAGH,EAAK,QAAU,EAEb,QAAG,UAAQ,IAAoB,EAAsB,WACrD,GAAa,EAAO,2FAOtB,QAAU,SAAY,KAAW,IAAA,EAAA,MAAA,wBAC/B,KAAa,EAAA,EAAQ,OAAA,EAAA,mDAQ1B,GAAA,EAAA,UCxGL,EAAA,2BAUM,OAAA,yBAAW,yBAAA,iDAEX,UAAS,cAET,GAAU,KAAA,UACV,UAAM,UACN,YAAO,SACP,YAAU,UACV,UAAA,cACA,SAAM,yBACN,QAAA,QACA,WAAA,EACA,UAAS,EACT,MAAA,EACA,MAAA,EACA,UAAA,EACA,gBAAe,wDAGjB,YAAK,8CAEH,SAAI,OACJ,UAAI,EACJ,cAAe,wDAIb,MAAI,UAAU,YAAA,aAAA,WAAA,WAAA,SAAA,EAAA,EAAA,EAAA,EAAA,WAMV,GAAgB,EAAA,EAAA,GAEpB,GAAA,MAGA,EAAM,QAAA,UAAsB,EAAQ,EAEpC,GAAM,EAAW,EAAQ,EACzB,IAAA,GAAM,EAAY,MAElB,GAAM,cACJ,aAAmB,IACjB,YAAQ,EAAS,kHAIrB,EAAM,UAAU,EAAS,WAErB,UAAQ,SAAO,8FAQnB,EAAM,OAAY,MAIlB,EAAM,WAAa,WACjB,MAAK,GAAQ,6DAOf,EAAM,WAAA,WACJ,IAAK,GAAI,GAAI,EAAG,EAAI,EAAM,SAAS,OAAQ,IACrC,EAAM,UAAU,IAClB,EAAM,QAAQ,iEAOZ,EAAA,UAAS,IACf,EAAM,QAAW,MAOf,OAAQ,SAAU,KACf,SAAQ,IACN,wBAGP,SAAa,SAAA,4CAGf,EAAQ,UAAS,GAAS,EAAO,aAAA,OAAA,EAAA,aAAA,QAAA,GAAA,GAAA,EAAA,aAAA,KAAA,GAC3B,EAAQ,MAAM,EAAA,aAAgB,QAEhC,EAAA,aAAiB,EAEf,EAAA,uBAGK,SAAA,MACL,GAAA,EAAW,SAAA,GAAc,4BAEzB,SAAQ,6HAYR,MAAM,EAAA,YAAe,UAAW,EAAgB,EAAA,sCAM1C,aAAM,EAAgB,SAAM,sBACpC,EAAM,UAAe,QAAQ,QAAA,EAAgB,mEAKtB,EAAC,UAAY,EAAA,kFAOxC,EAAQ,WAAY,WAClB,MAAG,GAAQ,WAAU,sDACZ,EAAM,SAAA,QAMjB,EAAQ,UAAY,SAAS,GAC3B,MAAA,GAAQ,SACD,KAAA,EAAA,aAAA,QAAA,GAEF,EAAM,eAAY,sDAMzB,IAAA,EAAA,cAEM,EAAA,SAAA,GAAA,QAAA,cAGJ,MAAG,gCAQH,sBAFF,EAAA,kBAEE,EAAI,CACJ,GAAI,GAAA,QAAA,QAAA,EAAA,gGAWJ,sBAHA,EAAG,mBAGH,EAAM,WAAA,KAAA,EAAA,SAAA,IAAA,EAAA,wCAKY,MAAhB,EAAA,SAAgB,EAAA,aAAA,EAAA,EAAA,eACM,KAAlB,EAAA,SAAkB,EAAA,aAAA,EAAA,SAAA,OAAA,EAAA,EAAA,eACxB,QAAA,YAAA,EAAA,gBAAA,EAAA,aAAA,GACA,EAAG,eAKH,GAAS,EAAA,OACP,KAAQ,iBAEN,iDAKN,EAAI,WACJ,EAAQ,SAAO,GAAA,EAAW,aAAA,YAAA,EAAA,cACxB,EAAQ,UACL,EAAQ,GAAA,UAAU,EAAA,uCAMvB,GAAO,KAAA,+GAKT,GAAO,SA3LL,qCAAI,8BAAuC,KAAA,EAAA,UAAA,2CAmM/C,qBAAI,qGAQA,GAAI,EAAW,2EAQb,IAAY,MAAA,EAAW,YAAA,EAAA,YAMzB,YALE,SAAU,YAAgB,YAAA,QAAA,UAAA,WAAA,OAAA,YAAA,WAAA,cAAA,WAAA,iBAAA,YAAA,gBAAA,UAAA,WAAA,gBAAA,YAAA,MAAA,SAAA,GAC1B,QAAQ,UAAM,EAAA,MAAA,EAAA,GAAA,EAAA,MAIuB,WAAvC,EAAI,GAAA,SAAgB,cAAmB,iCAGvC,EAAI,QAAS,QAAQ,2FAQjB,EAAO,EAAO,EAAA,EAAA,GAGf,EAAA,EAAA,OAAA,GAAA,QAAA,OAAA,IAAA,6BAGH,EAAa,SAAK,EAAS,oBAEzB,EAAO,OAAA,GACP,EAAW,+CAOX,EAAG,uBACD,iBAIG,QAAS,iBAEL,IACL,UAAW,QAAc,QAAA,EAAA,8CAG3B,SADK,EAAA,UAAA,GACG,QAAO,UAAU,GAAW,EAAA,OAAA,SAAA,GAAA,OAAA,IACpC,OAAA,QAAW,WAEb,sCAAc,EAAA,OAAW,KAAW,EAAQ,eAAe,EAAS,8BAKlE,EAAQ,EAAA,UAAe,EAAW,4GAMpC,EAAI,WACJ,EAAU,SAAA,SAAA,GACV,OAAS,GAAA,IAAA,EAAA,qCAMd,GAAA,EAAA,UC7TL,EAAA,2BAUM,OAAA,uDAIA,GAAW,KAAA,0DAGX,SAAK,WACL,YAAQ,kFAQR,QAAK,SAAS,YAAgB,WAAA,eAAA,SAAA,mDAK9B,EAAK,UAAA,EAAA,SAAA,iDAGH,OAAY,EAAK,YAKjB,2BAA8B,EAAA,4CAG9B,EAAK,OAAO,KAAA,oDAKV,EAAA,EAAA,OAAA,6BAKA,EAAA,MAKC,IAAO,GAAU,IAAA,EAAA,OAAA,QAGpB,8EAOJ,EAAK,OAAO,QAAW,EACrB,EAAI,2BAAO,QAAA,SAAA,GACX,6BAOH,GAAA,0BAEC,EAAI,WAAgB,iBAMlB,UAAa,UAAU,WAAY,OAAU,SAAK,SAAA,EAAA,EAAA,EAAA,MAEhD,GAAO,EAAK,0DAIR,SACA,uHAKD,SAAa,EAAA,EAAA,EAAA,4BASd,QAAA,KAAY,sEAGH,2BAAA,KAAA,+CAKX,EAAU,YAAc,KAAA,SAAA,GAGtB,yBAAI,qBAQJ,GAAA,GAAmB,EAAA,EAAc,8HASxC,EAAU,WAAA,EAAA,wBAQD,UAAA,UAAa,WAAY,OAAA,SAAA,EAAA,EAAA,mBAGrB,YAAS,wDA6BjB,GAAA,GAAA,EAAA,OAAA,QAAA,yFAzBgB,EAAK,QAIrB,GAAG,SAAW,sEAQd,EAAU,SAAY,WACpB,EAAA,SAAW,EAAQ,SAAA,aAIf,MAAQ,8CAajB,EAAA,2BAAA,KAAA,WClLL,MAEQ,iBAQF,OAAA,4BAAU,kCAAA,+CAEV,aAAQ,WAGV,GAAA,GAAK,KAAA,WAEH,EAAI,KAAW,UACf,SAAI,IACJ,SAAI,qBAIJ,MAAS,UAAS,YAAe,aAAA,aAAA,WAAA,WAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,WAQ3B,GAAQ,EAAS,GACrB,MAAI,GAAA,GAAc,UAAS,EAAQ,GAAA,SAAS,gBAAA,EAAA,+BAM1C,GAAM,QAAU,UAAA,EAAA,EAChB,GAAO,UAAM,EAAA,QAAA,6CAGX,EAAA,EAAa,SAAA,EAAA,EAGjB,IAAA,EAAI,GAEJ,MADA,GAAI,GAAA,UACA,EAAA,EAGJ,IAGI,GAAA,MAKF,MAGA,EAXE,6BAKJ,cAQW,KAAG,0BAMZ,EAAA,EAA6B,KAAA,cAAe,EAAA,UAC5C,EAAA,EAAA,KAAA,cAAA,EAAA,yEAGA,EAAG,GAAA,SAAU,gHASb,EAAK,GAAA,yBAQL,KAAA,UACA,KAAA,QAAA,qEAOF,EAAW,IAAA,SAAA,WAGL,uGAcJ,EAAa,KAAA,IAAA,EAAe,YAAc,EAAA,KAAA,iBAGxC,EAAG,EAAY,GAAe,WAAc,IAAA,EAAA,GAAA,OAC5C,MAAG,GAAe,iBAAU,EAAY,4FAM5C,IAAW,EAAA,GAA6B,wDAGtC,MAAA,GAAW,iBAA0B,EAAA,MAKvC,EAAW,2BAA4B,sBAGhC,EAAe,cAAA,yCAOpB,GAAA,GAAe,EAAQ,mBAAA,EACvB,KACG,EAAS,OAAQ,YAAiB,UACnC,EAAQ,EAAgB,OAAS,OAAS,EAAA,EAAA,OAAA,SAAA,SAAA,yDAK5C,EAAO,EAAgB,SACrB,OAAW,SAAW,UACrB,EAAA,EAAA,OAAA,OAAA,EAAA,EAAA,OAAA,SAAA,SAAA,sDAKL,EAAW,mBAAe,SAAW,+BAEnC,MAAQ,GAAA,SAAQ,IACd,MAKF,aAAiB,mBAEf,QAAU,EAAc,SAAA,kCAEzB,GAAc,UAAM,EAAA,EAAA,OAAA,GAAA,IAAA,KACnB,EAAS,QAAc,OAAF,EAAE,YAAA,EAAA,WAAA,EAAA,EAAA,UAGzB,EAAA,iDAIF,KAAA,SAAW,EAAA,GACT,MAAA,GAAA,UAAsB,EAAA,YAGxB,OAIM,aAAW,SAAA,EAAA,KACX,MAAA,OAAA,EAAA,OAAA,OAGJ,eAAkB,SAAgB,EAAO,6BAG3C,GAAA,EAAsB,GAAA,SAAY,GAAA,EAAA,GAAA,SAAA,EAAA,CAChC,EAAA,0JAvKJ,EAAS,QAAA,QAAiB,EAAQ,SAAA,KAyLpC,OAAO,iBAME,eAAQ,aAAsB,WAAQ,aAAY,aAAA,SAAA,EAAA,EAAA,EAAA,mBAGnD,WACJ,SAAU,EAAa,EAAQ,GAE/B,GAAA,IAAU,MAAY,WAChB,SAAW,SAAA,UAAA,SAAA,GACb,QAAA,UAAU,EAAA,MAAe,EAAQ,GAAQ,EAAA,SAG3C,GAAU,EAAA,KACV,aAAY,EAAA,OAAA,4GAiBZ,mBAAsB,aAAA,WAAyB,aAAe,aAAa,8FAMhF,SAAA,QAAA,EAAA,SAAA,GC7PL,GAAA,GAAA,QAAA,QAAA,wFAUM,OAAA,4IAKA,cAAW,cAEX,GAAM,KAAA,UACN,UAAO,mCAEP,UAAW,cACX,SAAU,iCACV,QAAA,QACA,WAAA,EACA,UAAA,EACA,MAAA,EACA,MAAA,EAEA,WAAU,EACV,SAAA,OACA,WAAQ,YACR,gBAAU,KACV,WAAA,4BAGF,OAAK,aAEH,WAAI,EACJ,OAAI,iCACJ,SAAI,mCACJ,cAAa,qIAUP,GAAa,EAAe,EAAQ,WAuNpC,GAAW,EAAA,QACH,GAAA,gBAAoB,CAC5B,GAAA,GAAW,EAAA,GAAA,iBACX,GAAQ,UAAG,sEAIN,GAAA,GAAA,kBACP,EAAQ,GAAG,kBAAA,EAAA,iGAOR,OACD,GAAQ,4EAhOR,EAAA,EAAY,KACZ,EAAY,SAAM,EAAU,+BAM9B,EAAgB,EAChB,EAAS,EAAe,YAAO,GAAA,iIAGjC,EAAM,EAAoB,kBAAA,EAAA,WAAA,2CAI1B,EAAgB,EAAe,cAAO,GACpC,EAAA,EAAmB,OAAM,EAE3B,GAAM,QAAA,EAAa,SACjB,UAAY,EAAW,2EAQzB,EAAY,WAAS,EAAS,MAEzB,gBAAe,SAAU,KAC1B,eAAoB,iEAQxB,EAAY,MAAS,oHAEnB,EAAI,UACA,EAAe,UACnB,EAAa,YAIV,OAAQ,SAAc,EAAM,EAAA,kKAKrB,IAAZ,GAAY,EAAiB,WAAe,WAAA,EAAA,cAC1C,EAAK,cAAW,QAAc,KAAM,EAAW,eAC7C,2BAEF,EAAI,WAAiB,EAAW,MAAA,oFAQlC,GAAA,IAAY,GAAS,EAAW,YAAA,iDAE9B,EAAO,cAAiB,QAAA,KAAW,EAAS,aAC5C,EAAI,cAKA,OAAc,cAEhB,GACc,EADd,EAAa,EAAK,SAAe,SAAS,EAAA,OAAU,EAAA,IACpD,yEAGF,EAAI,MAAO,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,GAAA,SAAA,EAAA,YAAA,EAAA,QAEE,GAAX,4BAEF,EAAM,GAAO,MAAA,KAAA,EAAA,EAAA,EAAA,EAAA,QAAA,EAAA,GAAA,EAAA,YACb,EAAM,MAAS,KAAA,EAAA,MAAA,EAAA,EAAA,GAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,GAAA,SAAA,EAAA,YAAA,EAAA,IAGf,IAAA,gDAIA,GAAI,KAAA,IACC,OAAG,IACN,MAAY,EAAA,OAAe,EAAY,GAAM,MAAA,WAAA,mBAC3B,IACX,UAAK,+BAIhB,MAAA,GAAY,MACN,IAAA,EACD,EAAU,aAAG,EAAA,MAAA,WACC,IAAf,EACK,EAAG,eAAa,EAAA,MAAA,aADrB,QAHsB,2CAUpB,KAAN,EACE,EAAY,EAAA,UAA4B,IAAV,EAAU,OAC1B,IAAZ,MACK,EAAA,UAAA,KAAA,EAAA,oCAKT,EAAA,aAAY,SAAiB,EAAS,GACb,WAAnB,EAAA,cACJ,EAAY,eAAQ,EAAY,GAEhC,EAAc,WAAG,EAAA,MAIP,eAAW,SAAW,EAAS,4BAEzC,EAAY,EAAO,cAAgB,EAAA,EAAA,GAAA,2CAGrC,EAAY,SAAA,EAAa,SAAS,EAAO,SAAO,IAAA,GAG5C,EAAA,WAAiB,EAAW,SAAM,EAAS,WAAgB,IAAA,KAEnD,OAAA,EAAa,GAAA,+BAIvB,GAAA,0DAGF,QAAY,OAAA,GAAe,KAAS,EAAK,sBAEvC,EAAc,GAAA,MAAS,KAAA,EAAA,EAAA,EAAkB,KAAS,EAAI,OAAA,EAAA,EAAA,OAAA,EAAA,YACtD,QAAI,OAAA,GAAA,OAAA,EAAA,gBAEJ,EAAY,YAGR,aAAoB,SAAA,MAEE,UAAxB,EAAA,OAAS,SAAA,eAAe,EAAA,wCAI5B,GAAA,GAAY,QAAa,QAAS,EAAK,OACJ,YAA5B,EAAA,GAAA,SAAmB,gBACpB,EAAA,EAAA,+DAOJ,GAAI,mBAAmB,KAAA,EAAA,WAAY,EAAA,WAAA,EAAA,OAAnC,IACA,EAAI,iBACJ,EAAI,sDAMF,GAAO,GAAA,MAAY,EAAI,SACf,EAAI,WAAgB,EAAgB,EAAA,EAAgB,GAAY,2EAMxE,KACY,OAAP,QAAO,EAAyC,EAAjB,EAAiB,EAAS,EAAQ,EAAU,sCAKhF,IAAO,EAAY,EACP,6DAEI,KAAhB,EAAA,SAA2B,EAAS,SAAA,EAAe,SAAA,EAAA,SAAA,OAE3C,EAAA,EAAqB,GAAA,OAC7B,GAAI,EAAa,IACF,IAAf,4DAEiB,KAAnB,EAAY,SAAgB,EAAA,WAAe,EAAA,SAAA,EAAA,WAAA,KAE3C,EAAY,EAAA,EAAA,GAAA,yEAMZ,EAAW,OAAG,EAAA,GAAiB,KACzB,EAAsB,GAAA,EAAA,MACjB,eA0BT,GAAQ,EAAK,OACL,KAAG,kCAEb,EAAA,KAAA,OAAA,uDAGE,IACJ,EAAY,KAAA,OAAU,QACpB,EAAG,KAAY,WAAQ,QACrB,EAAQ,GAAA,QAAI,QAEd,MAGF,IAAI,GAAQ,EAAY,OACxB,GAAY,QAAO,WACjB,GAAA,EAAA,4BAGA,WAGI,EAAW,2BAKjB,EAAI,WACJ,EAAY,SAAO,GAAS,EAAM,aAAA,YAAA,EAAA,cAC5B,EAAA,UACJ,EAAY,GAAA,UAAa,EAAU,aAEjC,GAAA,2CAKJ,EAAO,+GAKT,EAAO,UA1RL,IADI,QAAc,QAAO,EAAA,SAAA,MACrB,8BAAsB,KAAA,EAAA,UAAA,YAC1B,EAAY,eAAY,GAAA,UAAA,+CAgS7B,EAAU,SAAA,kBAQP,gBAAS,UAAA,SAAA,KAAA,iBAAA,cAAA,cAAA,SAAA,EAAA,EAAA,EAAA,EAAA,EAAA,gFAIe,GAAO,uBAAY,EAAA,wFAkDvC,GAAI,QAAS,OAAA,GAAb,IACI,GAAA,MAAA,EAAA,UAAA,GAAA,MAAA,EAAA,WAAA,YAAA,KAAA,EAAA,IAAA,EAAA,mFAEJ,EAAW,GAAa,wGAuExB,2FApHA,IAAW,MAAS,EAAA,WAAW,WAC/B,SAAa,YAAO,YAAoB,QAAA,UAAW,WAAA,OAAA,YAAA,WAAA,YAAA,WAAA,aAAA,kBAAA,YAAA,WAAA,aAAA,SAAA,gBAAA,SAAA,WAAA,MAAA,SAAA,0CAKrD,EAAI,QAAA,EAAa,OAAA,EAAY,OAAS,SAAY,GAClD,GAAqB,QAAA,UAAA,kEAErB,KAAW,EAAQ,EAAA,OAAA,EAAA,8EAMnB,GAAI,EAAa,sBAGjB,EAAiB,SAAA,EAAW,+BAKxB,EAAA,GAA0B,OAAA,EAAW,WAAA,KAAA,sDAKzC,QAAM,UAAY,EAAA,KAAS,EAAS,SAAU,EAAA,SAAU,6CAEtD,MAAA,EAAkB,SAAW,KAAA,EAAA,SAC5B,EAAA,EAAA,kBAKG,OAAA,EAAA,QAAmB,WAEvB,EAAW,OAAA,EAAa,cACxB,KAkBS,SAAA,QAAA,SAAA,GAGT,IAAI,QAIF,GAAA,aAAA,QAAA,GACK,sDAGP,QAAG,GAAQ,MAAa,EAAU,eAChC,GAAO,aAAW,QAAY,MAKd,GAEX,aAAA,SACE,EAAS,EAAW,EAAA,iBAAA,EAAA,wGAKH,QAAjB,EAAA,oCAGN,GAAQ,MAAA,EAAY,iBAKd,YAAW,KAAM,SAAA,MAExB,SAEA,WADK,YAAA,IAAA,OAAA,EACE,8CAIT,EAAW,MAAa,EAAA,KAAA,EAAA,0BACjB,SAAA,EAAA,4DAcT,EAAU,IAAA,kCASb,GAAA,EAAA,UC7dL,EAAA,2BAUM,OAAA,0BAAa,+CAEb,WAAQ,cAER,GAAU,KAAA,UACV,UAAA,UACA,YAAS,GACT,YAAU,UACV,YAAM,UACN,WAAM,EACN,QAAO,EACP,UAAM,MACN,SAAO,2BACP,iBAAW,EACX,QAAA,kCAGF,MAAK,WAEH,KAAI,GACJ,MAAI,EACJ,WAAI,EACJ,WAAI,wKAUE,GAAiB,EAAS,WA+MvB,OACH,MAAO,EAAS,YAAA,QAAA,WAkDd,0EAQN,MAAS,GAAS,GAAA,MAIlB,cAgGM,iGAKG,WAAA,IACH,EAAA,GAAmB,UAAR,EAAsB,aAAA,QAAA,EAAA,OACrC,EAAS,GAAa,UAAT,EAAuB,aAAA,OAAA,EAAA,OACpB,WAAd,GAAuB,UAAA,GAAA,EAAA,GAAA,EAAA,aAAA,YAAA,EAAA,qCAKrB,YACA,GAAA,EAAa,QAAY,MAAA,qEAKtB,WAAA,IACJ,EAAQ,IAAY,UAAZ,EAAqB,aAAA,QAAA,EAAA,OAC9B,EAAA,IAAuB,UAAT,EAAkB,aAAA,OAAA,EAAA,OAC3B,cAAA,UAAA,GAAA,EAAA,IAAA,EAAA,aAAA,YAAA,EAAA,4BAKT,QAAS,KACgB,UAApB,EAAQ,QACT,EAAW,GAAA,QAAI,EAAS,UAExB,EAAQ,GAAA,QAAI,EAAS,eAIzB,QAAI,KACK,UAAT,EAAS,kCAGP,EAAS,IAAA,QAAW,EAAA,uBAKlB,OAGI,2BAKJ,EAAA,GAAA,QAAe,EAAS,MAExB,GAAyB,SAI7B,QAAS,KACP,+DAQA,EAAI,0BAKF,GAAiB,mBAGnB,IAAI,GAAA,EAAA,GAEF,EAAQ,EAAA,uBACH,UAAA,kFAYP,OALF,wBAAS,EAAA,OAAoB,GAEvB,EAAQ,SAAgB,GAGvB,QAAA,UAAA,EAAA,WAGD,GAAsB,EAAS,EAAA,EAAA,SAEjC,EAAA,EAAA,MAAA,YAEA,EAAS,QACP,oCAGF,KAAA,EAAA,KAAA,EAAA,MAEA,WACE,+BAGF,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,EAAA,EAEA,WACE,mCAGF,KAAA,EAAA,KAAA,QAGF,SACE,8CAOE,EAAA,SACA,MAIY,UAAT,IAA0B,WAAV,EAAA,GACrB,OAAQ,EAAM,IACd,IAAK,OACH,EAAO,KAAM,EAAS,IACtB,MACF,KAAK,QACH,EAAO,KAAM,EAAS,KAAM,EAAS,MAAA,qDAIzC,IAAO,yBAGT,KAAS,SACP,EAAW,IAAM,EAAK,IAAM,EAAY,wBAOrC,GAAqB,EAAA,KACnB,KAAQ,IAAA,EAAW,KAAA,KAAA,EAAA,iCAKpB,uCAID,mFA5gBH,iJAOF,IAAA,EAAS,OAAM,QAAQ,SAAc,EAAK,OAAS,wFAQnD,EAAM,IAAA,EAAc,IAAS,EAAA,KAAW,OAAA,iGAUxC,EAAM,WAAQ,mDAKd,EAAM,wFASN,EAAI,aAAS,2BAKL,SAAA,EAAa,UAAgB,QAG3B,IAGJ,kKAQD,OAFD,GAAW,SAAY,EAAa,EAAA,oBAAc,EAAA,KACtD,EAAS,WAAc,WAAS,KAAU,GAC7B,EAAS,GAAA,yDAQtB,QAAS,SAAO,KAAW,EAAA,EAAA,6DAGzB,EAAY,IACF,EAAQ,KACd,0HAoBJ,EAAA,+CAGG,EAAQ,YACT,EAAQ,EAAiB,EAAU,YAIrC,0EAQF,EAAS,0GAiBP,EAAK,cAIL,MAAU,+BAEC,6DAOS,OAAd,GAAc,EAAc,QAClC,EAAI,MAAQ,mBAIR,KAAQ,gBACH,YAAA,EAAA,wDAGF,CACL,GAAS,WACT,EAAQ,0DAOV,EAAW,KACX,EAAA,UAOA,EAAW,EAAA,OAAW,gHAQtB,EAAI,WAAU,EAAe,SAAY,EAAQ,wDAIjD,EAAW,aAAA,EAAA,SAAA,EAAA,mCAKT,IAAG,EAAY,MAAW,EAAK,KAAA,iCAIjC,EAAG,WACD,EAAG,kBAGH,GAAA,EAAA,KAAA,WAAA,cAIA,EAAA,oEAiBI,MAAA,oCAGK,iCAIb,EAAI,WAAA,WACA,QAAA,GACJ,EAAS,QAEJ,EAAC,MAAS,oBAIb,wBAIA,GAAA,EAAa,SAAb,yCAIA,EAAI,EAIJ,EAAW,KAIT,GAAA,EAAA,MAAA,EAAA,wBAGF,EAAG,SAAQ,EAAa,UAAA,IACtB,yBAIJ,iCAwBA,EAAS,OAAA,WACP,EAAQ,SAAY,EAAA,QAAA,EAAA,oFAahB,gBAAW,cACb,sCAKF,EAAW,EAAS,KAAQ,kEAY1B,GAAI,0DAKO,IACT,GAAY,4HAMd,EAAK,EAAsB,QAAW,SAAA,OAClC,EAAwB,QAAA,QAAW,GAAA,EAAyB,IAAA,EAAA,EAAA,2NAclE,EAAmC,SAAnC,EAA+C,QAAA,EAAA,QAAA,QAAA,SAGjD,EAAS,YAAW,GAAc,SAAA,wCAQ5B,SAAc,SAAI,GACT,KAAX,EAAA,OAAW,EAAA,WACX,EAAI,+BAKF,cAAA,SAAA,GACA,KAAA,EAAA,oBAEJ,EAAA,oBAIF,EAAS,yBAAoB,SAAA,GAC3B,EAAI,iBACJ,EAAA,oBAEI,SAAW,EAAS,GAAA,OAAS,EAAA,GAAA,2BA6LrC,QAAI,GAAgB,GACpB,EAAA,SAAS,EAAc,OAAU,EAAA,MAAA,SAAA,EAAA,kBAGzB,GAAS,EAAK,SACf,SAAQ,SAAS,GAAM,GAAA,iBAAA,YAI1B,GAAO,qEAIX,MAAO,SAAA,SAAA,yFAvjBL,EAAe,cACf,EAAI,QAAU,QAAS,EAAW,cA8jBtC,OAAO,iBAMC,aAAW,UAAO,YAAA,OAAA,WAAA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,0DAQpB,IAAM,MAAQ;iOAOZ,EAAM,eAAa,aACnB,MAAQ,qGAOZ,GAAK,MAAa,EAAA,YAAa,GAC7B,QAAG,UAAiB,IAAW,EAAA,WAC7B,GAAQ,EAAO,uEAOhB,QAAA,SAAA,uBAGH,EAAK,MAAU,EAEb,QAAG,UAAQ,IAAoB,EAAA,WAC/B,GAAa,EAAO,iEAMhB,GAAY,QAAQ,UAAU,KAC/B,QAAQ,SAAS,KAAW,IAAa,EAAS,MAAM,wBAC3D,KAAa,EAAA,EAAQ,OAAQ,EAAW,UAI1C,EAAI,WAAU,EAAS,OAAA,EAAS,UAAA,SAAA,6BAGhC,QAAU,SAAY,KAAW,IAAA,EAAA,MAAA,0BACX,EAAA,WAApB,KAAY,GAAQ,GAAA,+CAQzB,GAAA,EAAA,UC1qBL,EAAA,2BAUM,OAAA,4BAAW,yBAAA,iDAEX,aAAS,cAET,GAAU,KAAA,UACV,UAAM,UACN,YAAO,YACP,YAAW,aACX,UAAQ,cACR,SAAO,+BACP,QAAA,iCAGF,MAAK,UAEH,UAAI,kBAEJ,MAAA,mGAQM,GAAc,EAAO,EAAA,YAKvB,EAAM,QAAA,UAAe,EAAA,EAEvB,GAAM,EAAA,EAAA,iBAEN,EAAM,EAAY,SAEd,cAAW,2CAIf,EAAM,kBAEF,UAAW,SAAO,+GAYjB,WAAM,iBACP,GAAM,gBAKF,OAAA,SAAe,2CAGvB,EAAA,aAAoB,MAIlB,SAAW,SAAA,GACX,EAAM,aAAA,KAGA,OAAM,SAAQ,4DAKtB,EAAA,gBACK,GAAS,EAAc,kDAO5B,EAAW,WAAY,WACrB,MAAI,GAAI,WAAe,wFAChB,EAAA,SAAA,2DAQT,IAAA,EAAA,cAEM,EAAA,SAAA,GAAA,QAAA,oDAQJ,EAAG,mBACD,oIAaI,KAAN,EAAM,SAAA,EAAA,SAAA,gCAKc,KAAlB,EAAO,SAAW,EAAA,aAAA,EAAA,EAAA,eACJ,KAAlB,EAAW,SAAkB,EAAA,aAAA,EAAA,SAAA,OAAA,EAAA,EAAA,eAC3B,QAAA,YAAA,EAAA,gBAAA,EAAA,aAAA,uBAMI,EAAW,2BAKjB,EAAW,WACX,EAAW,SAAO,GAAA,YAAW,EAAA,cAC3B,EAAW,UACR,EAAQ,GAAA,UAAU,EAAA,uCAMvB,GAAO,KAAA,gGAKT,uCAQF,qBAAI,2GAQA,GAAI,EAAkB,wEAQtB,GAAI,IAAA,MAAa,+LAEb,QAAA,UAAiB,EAAA,MAAA,EAAA,GAAA,EAAA,KAIrB,IAAI,GAAA,EAAgB,QAAA,EAAc,mGAM/B,IAAQ,GAAc,IAAA,8BAEvB,GAAI,EAAiB,GAGnB,EAAA,EAAuB,EAAO,EAAY,8GAQ9C,EAAkB,SAAS,EAAA,GAAmB,KAAA,SAAU,eAEtD,EAAM,cAEL,KAIG,OAAA,EAAW,QAAA,SAAc,qBAGjB,SAAS,EAAO,QACtB,SAAA,GAGJ,GAAG,EAAO,aAAgB,EAAO,QAAG,EAAU,OAAU,aACvD,GAAA,cAAuB,EAAO,WAAA,UAAA,EAAA,EAAA,WAAA,OAAA,sEAOZ,IAAvB,EAAW,QAAiB,EAAS,GAAA,QAAY,qBAG/C,EAAO,8CAOP,GAAI,GAAQ,EAAoB,aAAW,EAC3C,OAAI,KAAmB,EAAU,GAAA,yBAMnC,GAAA,EAAU,SAAY,EAAW,YAAA,MAAA,GAAA,IAAA,GAC/B,IAAI,GAAA,EAAW,UAAU,EAAA,aACzB,EAAU,QAAA,UAAA,GAAA,EAAA,OAAA,SAAA,GAAA,MAAA,EAAA,UACV,GAAA,QAAY,SAAA,GAAA,EAAA,aAAA,GAAA,4FAMjB,GAAA,EAAA","file":"angular-strap.min.js","sourcesContent":["\nangular.module('mgcrea.ngStrap', [\n 'mgcrea.ngStrap.modal',\n 'mgcrea.ngStrap.aside',\n 'mgcrea.ngStrap.alert',\n 'mgcrea.ngStrap.button',\n 'mgcrea.ngStrap.select',\n 'mgcrea.ngStrap.datepicker',\n 'mgcrea.ngStrap.timepicker',\n 'mgcrea.ngStrap.navbar',\n 'mgcrea.ngStrap.tooltip',\n 'mgcrea.ngStrap.popover',\n 'mgcrea.ngStrap.dropdown',\n 'mgcrea.ngStrap.typeahead',\n 'mgcrea.ngStrap.scrollspy',\n 'mgcrea.ngStrap.affix',\n 'mgcrea.ngStrap.tab',\n 'mgcrea.ngStrap.collapse'\n]);\n","'use strict';\n\nangular.module('mgcrea.ngStrap.affix', ['mgcrea.ngStrap.helpers.dimensions', 'mgcrea.ngStrap.helpers.debounce'])\n\n .provider('$affix', function() {\n\n var defaults = this.defaults = {\n offsetTop: 'auto'\n };\n\n this.$get = function($window, debounce, dimensions) {\n\n var bodyEl = angular.element($window.document.body);\n var windowEl = angular.element($window);\n\n function AffixFactory(element, config) {\n\n var $affix = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n var targetEl = options.target;\n\n // Initial private vars\n var reset = 'affix affix-top affix-bottom',\n setWidth = false,\n initialAffixTop = 0,\n initialOffsetTop = 0,\n offsetTop = 0,\n offsetBottom = 0,\n affixed = null,\n unpin = null;\n\n var parent = element.parent();\n // Options: custom parent\n if (options.offsetParent) {\n if (options.offsetParent.match(/^\\d+$/)) {\n for (var i = 0; i < (options.offsetParent * 1) - 1; i++) {\n parent = parent.parent();\n }\n }\n else {\n parent = angular.element(options.offsetParent);\n }\n }\n\n $affix.init = function() {\n\n this.$parseOffsets();\n initialOffsetTop = dimensions.offset(element[0]).top + initialAffixTop;\n setWidth = !element[0].style.width;\n\n // Bind events\n targetEl.on('scroll', this.checkPosition);\n targetEl.on('click', this.checkPositionWithEventLoop);\n windowEl.on('resize', this.$debouncedOnResize);\n\n // Both of these checkPosition() calls are necessary for the case where\n // the user hits refresh after scrolling to the bottom of the page.\n this.checkPosition();\n this.checkPositionWithEventLoop();\n\n };\n\n $affix.destroy = function() {\n\n // Unbind events\n targetEl.off('scroll', this.checkPosition);\n targetEl.off('click', this.checkPositionWithEventLoop);\n windowEl.off('resize', this.$debouncedOnResize);\n\n };\n\n $affix.checkPositionWithEventLoop = function() {\n\n // IE 9 throws an error if we use 'this' instead of '$affix'\n // in this setTimeout call\n setTimeout($affix.checkPosition, 1);\n\n };\n\n $affix.checkPosition = function() {\n // if (!this.$element.is(':visible')) return\n\n var scrollTop = getScrollTop();\n var position = dimensions.offset(element[0]);\n var elementHeight = dimensions.height(element[0]);\n\n // Get required affix class according to position\n var affix = getRequiredAffixClass(unpin, position, elementHeight);\n\n // Did affix status changed this last check?\n if(affixed === affix) return;\n affixed = affix;\n\n // Add proper affix class\n element.removeClass(reset).addClass('affix' + ((affix !== 'middle') ? '-' + affix : ''));\n\n if(affix === 'top') {\n unpin = null;\n element.css('position', (options.offsetParent) ? '' : 'relative');\n if(setWidth) {\n element.css('width', '');\n }\n element.css('top', '');\n } else if(affix === 'bottom') {\n if (options.offsetUnpin) {\n unpin = -(options.offsetUnpin * 1);\n }\n else {\n // Calculate unpin threshold when affixed to bottom.\n // Hopefully the browser scrolls pixel by pixel.\n unpin = position.top - scrollTop;\n }\n if(setWidth) {\n element.css('width', '');\n }\n element.css('position', (options.offsetParent) ? '' : 'relative');\n element.css('top', (options.offsetParent) ? '' : ((bodyEl[0].offsetHeight - offsetBottom - elementHeight - initialOffsetTop) + 'px'));\n } else { // affix === 'middle'\n unpin = null;\n if(setWidth) {\n element.css('width', element[0].offsetWidth + 'px');\n }\n element.css('position', 'fixed');\n element.css('top', initialAffixTop + 'px');\n }\n\n };\n\n $affix.$onResize = function() {\n $affix.$parseOffsets();\n $affix.checkPosition();\n };\n $affix.$debouncedOnResize = debounce($affix.$onResize, 50);\n\n $affix.$parseOffsets = function() {\n var initialPosition = element.css('position');\n // Reset position to calculate correct offsetTop\n element.css('position', (options.offsetParent) ? '' : 'relative');\n\n if(options.offsetTop) {\n if(options.offsetTop === 'auto') {\n options.offsetTop = '+0';\n }\n if(options.offsetTop.match(/^[-+]\\d+$/)) {\n initialAffixTop = - options.offsetTop * 1;\n if(options.offsetParent) {\n offsetTop = dimensions.offset(parent[0]).top + (options.offsetTop * 1);\n }\n else {\n offsetTop = dimensions.offset(element[0]).top - dimensions.css(element[0], 'marginTop', true) + (options.offsetTop * 1);\n }\n }\n else {\n offsetTop = options.offsetTop * 1;\n }\n }\n\n if(options.offsetBottom) {\n if(options.offsetParent && options.offsetBottom.match(/^[-+]\\d+$/)) {\n // add 1 pixel due to rounding problems...\n offsetBottom = getScrollHeight() - (dimensions.offset(parent[0]).top + dimensions.height(parent[0])) + (options.offsetBottom * 1) + 1;\n }\n else {\n offsetBottom = options.offsetBottom * 1;\n }\n }\n\n // Bring back the element's position after calculations\n element.css('position', initialPosition);\n };\n\n // Private methods\n\n function getRequiredAffixClass(unpin, position, elementHeight) {\n\n var scrollTop = getScrollTop();\n var scrollHeight = getScrollHeight();\n\n if(scrollTop <= offsetTop) {\n return 'top';\n } else if(unpin !== null && (scrollTop + unpin <= position.top)) {\n return 'middle';\n } else if(offsetBottom !== null && (position.top + elementHeight + initialAffixTop >= scrollHeight - offsetBottom)) {\n return 'bottom';\n } else {\n return 'middle';\n }\n\n }\n\n function getScrollTop() {\n return targetEl[0] === $window ? $window.pageYOffset : targetEl[0].scrollTop;\n }\n\n function getScrollHeight() {\n return targetEl[0] === $window ? $window.document.body.scrollHeight : targetEl[0].scrollHeight;\n }\n\n $affix.init();\n return $affix;\n\n }\n\n return AffixFactory;\n\n };\n\n })\n\n .directive('bsAffix', function($affix, $window) {\n\n return {\n restrict: 'EAC',\n require: '^?bsAffixTarget',\n link: function postLink(scope, element, attr, affixTarget) {\n\n var options = {scope: scope, offsetTop: 'auto', target: affixTarget ? affixTarget.$element : angular.element($window)};\n angular.forEach(['offsetTop', 'offsetBottom', 'offsetParent', 'offsetUnpin'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n var affix = $affix(element, options);\n scope.$on('$destroy', function() {\n affix && affix.destroy();\n options = null;\n affix = null;\n });\n\n }\n };\n\n })\n\n .directive('bsAffixTarget', function() {\n return {\n controller: function($element) {\n this.$element = $element;\n }\n };\n });\n","'use strict';\n\n// @BUG: following snippet won't compile correctly\n// @TODO: submit issue to core\n// ' ' +\n\nangular.module('mgcrea.ngStrap.alert', ['mgcrea.ngStrap.modal'])\n\n .provider('$alert', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'alert',\n prefixEvent: 'alert',\n placement: null,\n template: 'alert/alert.tpl.html',\n container: false,\n element: null,\n backdrop: false,\n keyboard: true,\n show: true,\n // Specific options\n duration: false,\n type: false,\n dismissable: true\n };\n\n this.$get = function($modal, $timeout) {\n\n function AlertFactory(config) {\n\n var $alert = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $alert = $modal(options);\n\n // Support scope as string options [/*title, content, */ type, dismissable]\n $alert.$scope.dismissable = !!options.dismissable;\n if(options.type) {\n $alert.$scope.type = options.type;\n }\n\n // Support auto-close duration\n var show = $alert.show;\n if(options.duration) {\n $alert.show = function() {\n show();\n $timeout(function() {\n $alert.hide();\n }, options.duration * 1000);\n };\n }\n\n return $alert;\n\n }\n\n return AlertFactory;\n\n };\n\n })\n\n .directive('bsAlert', function($window, $sce, $alert) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope, element: element, show: false};\n angular.forEach(['template', 'placement', 'keyboard', 'html', 'container', 'animation', 'duration', 'dismissable'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content', 'type'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n });\n });\n\n // Support scope as an object\n attr.bsAlert && scope.$watch(attr.bsAlert, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n }, true);\n\n // Initialize alert\n var alert = $alert(options);\n\n // Trigger\n element.on(attr.trigger || 'click', alert.toggle);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (alert) alert.destroy();\n options = null;\n alert = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.aside', ['mgcrea.ngStrap.modal'])\n\n .provider('$aside', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade-and-slide-right',\n prefixClass: 'aside',\n prefixEvent: 'aside',\n placement: 'right',\n template: 'aside/aside.tpl.html',\n contentTemplate: false,\n container: false,\n element: null,\n backdrop: true,\n keyboard: true,\n html: false,\n show: true\n };\n\n this.$get = function($modal) {\n\n function AsideFactory(config) {\n\n var $aside = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $aside = $modal(options);\n\n return $aside;\n\n }\n\n return AsideFactory;\n\n };\n\n })\n\n .directive('bsAside', function($window, $sce, $aside) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n // Directive options\n var options = {scope: scope, element: element, show: false};\n angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n });\n });\n\n // Support scope as an object\n attr.bsAside && scope.$watch(attr.bsAside, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n }, true);\n\n // Initialize aside\n var aside = $aside(options);\n\n // Trigger\n element.on(attr.trigger || 'click', aside.toggle);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (aside) aside.destroy();\n options = null;\n aside = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.button', [])\n\n .provider('$button', function() {\n\n var defaults = this.defaults = {\n activeClass:'active',\n toggleEvent:'click'\n };\n\n this.$get = function() {\n return {defaults: defaults};\n };\n\n })\n\n .directive('bsCheckboxGroup', function() {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n compile: function postLink(element, attr) {\n element.attr('data-toggle', 'buttons');\n element.removeAttr('ng-model');\n var children = element[0].querySelectorAll('input[type=\"checkbox\"]');\n angular.forEach(children, function(child) {\n var childEl = angular.element(child);\n childEl.attr('bs-checkbox', '');\n childEl.attr('ng-model', attr.ngModel + '.' + childEl.attr('value'));\n });\n }\n\n };\n\n })\n\n .directive('bsCheckbox', function($button, $$rAF) {\n\n var defaults = $button.defaults;\n var constantValueRegExp = /^(true|false|\\d+)$/;\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n var options = defaults;\n\n // Support label > input[type=\"checkbox\"]\n var isInput = element[0].nodeName === 'INPUT';\n var activeElement = isInput ? element.parent() : element;\n\n var trueValue = angular.isDefined(attr.trueValue) ? attr.trueValue : true;\n if(constantValueRegExp.test(attr.trueValue)) {\n trueValue = scope.$eval(attr.trueValue);\n }\n var falseValue = angular.isDefined(attr.falseValue) ? attr.falseValue : false;\n if(constantValueRegExp.test(attr.falseValue)) {\n falseValue = scope.$eval(attr.falseValue);\n }\n\n // Parse exotic values\n var hasExoticValues = typeof trueValue !== 'boolean' || typeof falseValue !== 'boolean';\n if(hasExoticValues) {\n controller.$parsers.push(function(viewValue) {\n // console.warn('$parser', element.attr('ng-model'), 'viewValue', viewValue);\n return viewValue ? trueValue : falseValue;\n });\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n return angular.equals(modelValue, trueValue);\n });\n // Fix rendering for exotic values\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n controller.$render();\n });\n }\n\n // model -> view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var isActive = angular.equals(controller.$modelValue, trueValue);\n $$rAF(function() {\n if(isInput) element[0].checked = isActive;\n activeElement.toggleClass(options.activeClass, isActive);\n });\n };\n\n // view -> model\n element.bind(options.toggleEvent, function() {\n scope.$apply(function () {\n // console.warn('!click', element.attr('ng-model'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);\n if(!isInput) {\n controller.$setViewValue(!activeElement.hasClass('active'));\n }\n if(!hasExoticValues) {\n controller.$render();\n }\n });\n });\n\n }\n\n };\n\n })\n\n .directive('bsRadioGroup', function() {\n\n return {\n restrict: 'A',\n require: 'ngModel',\n compile: function postLink(element, attr) {\n element.attr('data-toggle', 'buttons');\n element.removeAttr('ng-model');\n var children = element[0].querySelectorAll('input[type=\"radio\"]');\n angular.forEach(children, function(child) {\n angular.element(child).attr('bs-radio', '');\n angular.element(child).attr('ng-model', attr.ngModel);\n });\n }\n\n };\n\n })\n\n .directive('bsRadio', function($button, $$rAF) {\n\n var defaults = $button.defaults;\n var constantValueRegExp = /^(true|false|\\d+)$/;\n\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n var options = defaults;\n\n // Support `label > input[type=\"radio\"]` markup\n var isInput = element[0].nodeName === 'INPUT';\n var activeElement = isInput ? element.parent() : element;\n\n var value = constantValueRegExp.test(attr.value) ? scope.$eval(attr.value) : attr.value;\n\n // model -> view\n controller.$render = function () {\n // console.warn('$render', element.attr('value'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var isActive = angular.equals(controller.$modelValue, value);\n $$rAF(function() {\n if(isInput) element[0].checked = isActive;\n activeElement.toggleClass(options.activeClass, isActive);\n });\n };\n\n // view -> model\n element.bind(options.toggleEvent, function() {\n scope.$apply(function () {\n // console.warn('!click', element.attr('value'), 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue, 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue);\n controller.$setViewValue(value);\n controller.$render();\n });\n });\n\n }\n\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.collapse', [])\n\n .provider('$collapse', function() {\n\n var defaults = this.defaults = {\n animation: 'am-collapse',\n disallowToggle: false,\n activeClass: 'in',\n startCollapsed: false,\n allowMultiple: false\n };\n\n var controller = this.controller = function($scope, $element, $attrs) {\n var self = this;\n\n // Attributes options\n self.$options = angular.copy(defaults);\n angular.forEach(['animation', 'disallowToggle', 'activeClass', 'startCollapsed', 'allowMultiple'], function (key) {\n if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];\n });\n\n self.$toggles = [];\n self.$targets = [];\n\n self.$viewChangeListeners = [];\n\n self.$registerToggle = function(element) {\n self.$toggles.push(element);\n };\n self.$registerTarget = function(element) {\n self.$targets.push(element);\n };\n\n self.$unregisterToggle = function(element) {\n var index = self.$toggles.indexOf(element);\n // remove toggle from $toggles array\n self.$toggles.splice(index, 1);\n };\n self.$unregisterTarget = function(element) {\n var index = self.$targets.indexOf(element);\n\n // remove element from $targets array\n self.$targets.splice(index, 1);\n\n if (self.$options.allowMultiple) {\n // remove target index from $active array values\n deactivateItem(element);\n }\n\n // fix active item indexes\n fixActiveItemIndexes(index);\n\n self.$viewChangeListeners.forEach(function(fn) {\n fn();\n });\n };\n\n // use array to store all the currently open panels\n self.$targets.$active = !self.$options.startCollapsed ? [0] : [];\n self.$setActive = $scope.$setActive = function(value) {\n if(angular.isArray(value)) {\n self.$targets.$active = angular.copy(value);\n }\n else if(!self.$options.disallowToggle) {\n // toogle element active status\n isActive(value) ? deactivateItem(value) : activateItem(value);\n } else {\n activateItem(value);\n }\n\n self.$viewChangeListeners.forEach(function(fn) {\n fn();\n });\n };\n\n self.$activeIndexes = function() {\n return self.$options.allowMultiple ? self.$targets.$active :\n self.$targets.$active.length === 1 ? self.$targets.$active[0] : -1;\n };\n\n function fixActiveItemIndexes(index) {\n // item with index was removed, so we\n // need to adjust other items index values\n var activeIndexes = self.$targets.$active;\n for(var i = 0; i < activeIndexes.length; i++) {\n if (index < activeIndexes[i]) {\n activeIndexes[i] = activeIndexes[i] - 1;\n }\n\n // the last item is active, so we need to\n // adjust its index\n if (activeIndexes[i] === self.$targets.length) {\n activeIndexes[i] = self.$targets.length - 1;\n }\n }\n }\n\n function isActive(value) {\n var activeItems = self.$targets.$active;\n return activeItems.indexOf(value) === -1 ? false : true;\n }\n\n function deactivateItem(value) {\n var index = self.$targets.$active.indexOf(value);\n if (index !== -1) {\n self.$targets.$active.splice(index, 1);\n }\n }\n\n function activateItem(value) {\n if (!self.$options.allowMultiple) {\n // remove current selected item\n self.$targets.$active.splice(0, 1);\n }\n\n if (self.$targets.$active.indexOf(value) === -1) {\n self.$targets.$active.push(value);\n }\n }\n\n };\n\n this.$get = function() {\n var $collapse = {};\n $collapse.defaults = defaults;\n $collapse.controller = controller;\n return $collapse;\n };\n\n })\n\n .directive('bsCollapse', function($window, $animate, $collapse) {\n\n var defaults = $collapse.defaults;\n\n return {\n require: ['?ngModel', 'bsCollapse'],\n controller: ['$scope', '$element', '$attrs', $collapse.controller],\n link: function postLink(scope, element, attrs, controllers) {\n\n var ngModelCtrl = controllers[0];\n var bsCollapseCtrl = controllers[1];\n\n if(ngModelCtrl) {\n\n // Update the modelValue following\n bsCollapseCtrl.$viewChangeListeners.push(function() {\n ngModelCtrl.$setViewValue(bsCollapseCtrl.$activeIndexes());\n });\n\n // modelValue -> $formatters -> viewValue\n ngModelCtrl.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n if (angular.isArray(modelValue)) {\n // model value is an array, so just replace\n // the active items directly\n bsCollapseCtrl.$setActive(modelValue);\n }\n else {\n var activeIndexes = bsCollapseCtrl.$activeIndexes();\n\n if (angular.isArray(activeIndexes)) {\n // we have an array of selected indexes\n if (activeIndexes.indexOf(modelValue * 1) === -1) {\n // item with modelValue index is not active\n bsCollapseCtrl.$setActive(modelValue * 1);\n }\n }\n else if (activeIndexes !== modelValue * 1) {\n bsCollapseCtrl.$setActive(modelValue * 1);\n }\n }\n return modelValue;\n });\n\n }\n\n }\n };\n\n })\n\n .directive('bsCollapseToggle', function() {\n\n return {\n require: ['^?ngModel', '^bsCollapse'],\n link: function postLink(scope, element, attrs, controllers) {\n\n var ngModelCtrl = controllers[0];\n var bsCollapseCtrl = controllers[1];\n\n // Add base attr\n element.attr('data-toggle', 'collapse');\n\n // Push pane to parent bsCollapse controller\n bsCollapseCtrl.$registerToggle(element);\n\n // remove toggle from collapse controller when toggle is destroyed\n scope.$on('$destroy', function() {\n bsCollapseCtrl.$unregisterToggle(element);\n });\n\n element.on('click', function() {\n var index = attrs.bsCollapseToggle || bsCollapseCtrl.$toggles.indexOf(element);\n bsCollapseCtrl.$setActive(index * 1);\n scope.$apply();\n });\n\n }\n };\n\n })\n\n .directive('bsCollapseTarget', function($animate) {\n\n return {\n require: ['^?ngModel', '^bsCollapse'],\n // scope: true,\n link: function postLink(scope, element, attrs, controllers) {\n\n var ngModelCtrl = controllers[0];\n var bsCollapseCtrl = controllers[1];\n\n // Add base class\n element.addClass('collapse');\n\n // Add animation class\n if(bsCollapseCtrl.$options.animation) {\n element.addClass(bsCollapseCtrl.$options.animation);\n }\n\n // Push pane to parent bsCollapse controller\n bsCollapseCtrl.$registerTarget(element);\n\n // remove pane target from collapse controller when target is destroyed\n scope.$on('$destroy', function() {\n bsCollapseCtrl.$unregisterTarget(element);\n });\n\n function render() {\n var index = bsCollapseCtrl.$targets.indexOf(element);\n var active = bsCollapseCtrl.$activeIndexes();\n var action = 'removeClass';\n if (angular.isArray(active)) {\n if (active.indexOf(index) !== -1) {\n action = 'addClass';\n }\n }\n else if (index === active) {\n action = 'addClass';\n }\n\n $animate[action](element, bsCollapseCtrl.$options.activeClass);\n }\n\n bsCollapseCtrl.$viewChangeListeners.push(function() {\n render();\n });\n render();\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.datepicker', [\n 'mgcrea.ngStrap.helpers.dateParser',\n 'mgcrea.ngStrap.helpers.dateFormatter',\n 'mgcrea.ngStrap.tooltip'])\n\n .provider('$datepicker', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'datepicker',\n placement: 'bottom-left',\n template: 'datepicker/datepicker.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n // lang: $locale.id,\n useNative: false,\n dateType: 'date',\n dateFormat: 'shortDate',\n modelDateFormat: null,\n dayFormat: 'dd',\n monthFormat: 'MMM',\n yearFormat: 'yyyy',\n monthTitleFormat: 'MMMM yyyy',\n yearTitleFormat: 'yyyy',\n strictFormat: false,\n autoclose: false,\n minDate: -Infinity,\n maxDate: +Infinity,\n startView: 0,\n minView: 0,\n startWeek: 0,\n daysOfWeekDisabled: '',\n iconLeft: 'glyphicon glyphicon-chevron-left',\n iconRight: 'glyphicon glyphicon-chevron-right'\n };\n\n this.$get = function($window, $document, $rootScope, $sce, $dateFormatter, datepickerViews, $tooltip, $timeout) {\n\n var bodyEl = angular.element($window.document.body);\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isTouch = ('createTouch' in $window.document) && isNative;\n if(!defaults.lang) defaults.lang = $dateFormatter.getDefaultLocale();\n\n function DatepickerFactory(element, controller, config) {\n\n var $datepicker = $tooltip(element, angular.extend({}, defaults, config));\n var parentScope = config.scope;\n var options = $datepicker.$options;\n var scope = $datepicker.$scope;\n if(options.startView) options.startView -= options.minView;\n\n // View vars\n\n var pickerViews = datepickerViews($datepicker);\n $datepicker.$views = pickerViews.views;\n var viewDate = pickerViews.viewDate;\n scope.$mode = options.startView;\n scope.$iconLeft = options.iconLeft;\n scope.$iconRight = options.iconRight;\n var $picker = $datepicker.$views[scope.$mode];\n\n // Scope methods\n\n scope.$select = function(date) {\n $datepicker.select(date);\n };\n scope.$selectPane = function(value) {\n $datepicker.$selectPane(value);\n };\n scope.$toggleMode = function() {\n $datepicker.setMode((scope.$mode + 1) % $datepicker.$views.length);\n };\n\n // Public methods\n\n $datepicker.update = function(date) {\n // console.warn('$datepicker.update() newValue=%o', date);\n if(angular.isDate(date) && !isNaN(date.getTime())) {\n $datepicker.$date = date;\n $picker.update.call($picker, date);\n }\n // Build only if pristine\n $datepicker.$build(true);\n };\n\n $datepicker.updateDisabledDates = function(dateRanges) {\n options.disabledDateRanges = dateRanges;\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], $datepicker.$setDisabledEl);\n }\n };\n\n $datepicker.select = function(date, keep) {\n // console.warn('$datepicker.select', date, scope.$mode);\n if(!angular.isDate(controller.$dateValue)) controller.$dateValue = new Date(date);\n if(!scope.$mode || keep) {\n controller.$setViewValue(angular.copy(date));\n controller.$render();\n if(options.autoclose && !keep) {\n $timeout(function() { $datepicker.hide(true); });\n }\n } else {\n angular.extend(viewDate, {year: date.getFullYear(), month: date.getMonth(), date: date.getDate()});\n $datepicker.setMode(scope.$mode - 1);\n $datepicker.$build();\n }\n };\n\n $datepicker.setMode = function(mode) {\n // console.warn('$datepicker.setMode', mode);\n scope.$mode = mode;\n $picker = $datepicker.$views[scope.$mode];\n $datepicker.$build();\n };\n\n // Protected methods\n\n $datepicker.$build = function(pristine) {\n // console.warn('$datepicker.$build() viewDate=%o', viewDate);\n if(pristine === true && $picker.built) return;\n if(pristine === false && !$picker.built) return;\n $picker.build.call($picker);\n };\n\n $datepicker.$updateSelected = function() {\n for(var i = 0, l = scope.rows.length; i < l; i++) {\n angular.forEach(scope.rows[i], updateSelected);\n }\n };\n\n $datepicker.$isSelected = function(date) {\n return $picker.isSelected(date);\n };\n\n $datepicker.$setDisabledEl = function(el) {\n el.disabled = $picker.isDisabled(el.date);\n };\n\n $datepicker.$selectPane = function(value) {\n var steps = $picker.steps;\n // set targetDate to first day of month to avoid problems with\n // date values rollover. This assumes the viewDate does not\n // depend on the day of the month\n var targetDate = new Date(Date.UTC(viewDate.year + ((steps.year || 0) * value), viewDate.month + ((steps.month || 0) * value), 1));\n angular.extend(viewDate, {year: targetDate.getUTCFullYear(), month: targetDate.getUTCMonth(), date: targetDate.getUTCDate()});\n $datepicker.$build();\n };\n\n $datepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $datepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n if(evt.keyCode === 13) {\n if(!scope.$mode) {\n return $datepicker.hide(true);\n } else {\n return scope.$apply(function() { $datepicker.setMode(scope.$mode - 1); });\n }\n }\n\n // Navigate with keyboard\n $picker.onKeyDown(evt);\n parentScope.$digest();\n };\n\n // Private\n\n function updateSelected(el) {\n el.selected = $datepicker.$isSelected(el.date);\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $datepicker.init;\n $datepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'date');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $datepicker.destroy;\n $datepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $datepicker.show;\n $datepicker.show = function() {\n _show();\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n // if $datepicker is no longer showing, don't setup events\n if(!$datepicker.$isShown) return;\n $datepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $datepicker.$onKeyDown);\n }\n }, 0, false);\n };\n\n var _hide = $datepicker.hide;\n $datepicker.hide = function(blur) {\n if(!$datepicker.$isShown) return;\n $datepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $datepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $datepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $datepicker;\n\n }\n\n DatepickerFactory.defaults = defaults;\n return DatepickerFactory;\n\n };\n\n })\n\n .directive('bsDatepicker', function($window, $parse, $q, $dateFormatter, $dateParser, $datepicker) {\n\n var defaults = $datepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'dateType', 'dateFormat', 'modelDateFormat', 'dayFormat', 'strictFormat', 'startWeek', 'startDate', 'useNative', 'lang', 'startView', 'minView', 'iconLeft', 'iconRight', 'daysOfWeekDisabled', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!datepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(datepicker),?/i);\n newValue === true ? datepicker.show() : datepicker.hide();\n });\n\n // Initialize datepicker\n var datepicker = $datepicker(element, controller, options);\n options = datepicker.$options;\n // Set expected iOS format\n if(isNative && options.useNative) options.dateFormat = 'yyyy-MM-dd';\n\n var lang = options.lang;\n\n var formatDate = function(date, format) {\n return $dateFormatter.formatDate(date, format, lang);\n };\n\n var dateParser = $dateParser({format: options.dateFormat, lang: lang, strict: options.strictFormat});\n\n // Observe attributes for changes\n angular.forEach(['minDate', 'maxDate'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n // console.warn('attr.$observe(%s)=%o', key, newValue);\n datepicker.$options[key] = dateParser.getDateForAttribute(key, newValue);\n // Build only if dirty\n !isNaN(datepicker.$options[key]) && datepicker.$build(false);\n validateAgainstMinMaxDate(controller.$dateValue);\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n datepicker.update(controller.$dateValue);\n }, true);\n\n // Normalize undefined/null/empty array,\n // so that we don't treat changing from undefined->null as a change.\n function normalizeDateRanges(ranges) {\n if (!ranges || !ranges.length) return null;\n return ranges;\n }\n\n if (angular.isDefined(attr.disabledDates)) {\n scope.$watch(attr.disabledDates, function(disabledRanges, previousValue) {\n disabledRanges = normalizeDateRanges(disabledRanges);\n previousValue = normalizeDateRanges(previousValue);\n\n if (disabledRanges) {\n datepicker.updateDisabledDates(disabledRanges);\n }\n });\n }\n\n function validateAgainstMinMaxDate(parsedDate) {\n if (!angular.isDate(parsedDate)) return;\n var isMinValid = isNaN(datepicker.$options.minDate) || parsedDate.getTime() >= datepicker.$options.minDate;\n var isMaxValid = isNaN(datepicker.$options.maxDate) || parsedDate.getTime() <= datepicker.$options.maxDate;\n var isValid = isMinValid && isMaxValid;\n controller.$setValidity('date', isValid);\n controller.$setValidity('min', isMinValid);\n controller.$setValidity('max', isMaxValid);\n // Only update the model when we have a valid date\n if(isValid) controller.$dateValue = parsedDate;\n }\n\n // viewValue -> $parsers -> modelValue\n controller.$parsers.unshift(function(viewValue) {\n // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n // Null values should correctly reset the model value & validity\n if(!viewValue) {\n controller.$setValidity('date', true);\n // BREAKING CHANGE:\n // return null (not undefined) when input value is empty, so angularjs 1.3\n // ngModelController can go ahead and run validators, like ngRequired\n return null;\n }\n var parsedDate = dateParser.parse(viewValue, controller.$dateValue);\n if(!parsedDate || isNaN(parsedDate.getTime())) {\n controller.$setValidity('date', false);\n // return undefined, causes ngModelController to\n // invalidate model value\n return;\n } else {\n validateAgainstMinMaxDate(parsedDate);\n }\n if(options.dateType === 'string') {\n return formatDate(parsedDate, options.modelDateFormat || options.dateFormat);\n } else if(options.dateType === 'number') {\n return controller.$dateValue.getTime();\n } else if(options.dateType === 'unix') {\n return controller.$dateValue.getTime() / 1000;\n } else if(options.dateType === 'iso') {\n return controller.$dateValue.toISOString();\n } else {\n return new Date(controller.$dateValue);\n }\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var date;\n if(angular.isUndefined(modelValue) || modelValue === null) {\n date = NaN;\n } else if(angular.isDate(modelValue)) {\n date = modelValue;\n } else if(options.dateType === 'string') {\n date = dateParser.parse(modelValue, null, options.modelDateFormat);\n } else if(options.dateType === 'unix') {\n date = new Date(modelValue * 1000);\n } else {\n date = new Date(modelValue);\n }\n // Setup default value?\n // if(isNaN(date.getTime())) {\n // var today = new Date();\n // date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0);\n // }\n controller.$dateValue = date;\n return getDateFormattedString();\n });\n\n // viewValue -> element\n controller.$render = function() {\n // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n element.val(getDateFormattedString());\n };\n\n function getDateFormattedString() {\n return !controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : formatDate(controller.$dateValue, options.dateFormat);\n }\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if(datepicker) datepicker.destroy();\n options = null;\n datepicker = null;\n });\n\n }\n };\n\n })\n\n .provider('datepickerViews', function() {\n\n var defaults = this.defaults = {\n dayFormat: 'dd',\n daySplit: 7\n };\n\n // Split array into smaller arrays\n function split(arr, size) {\n var arrays = [];\n while(arr.length > 0) {\n arrays.push(arr.splice(0, size));\n }\n return arrays;\n }\n\n // Modulus operator\n function mod(n, m) {\n return ((n % m) + m) % m;\n }\n\n this.$get = function($dateFormatter, $dateParser, $sce) {\n\n return function(picker) {\n\n var scope = picker.$scope;\n var options = picker.$options;\n\n var lang = options.lang;\n var formatDate = function(date, format) {\n return $dateFormatter.formatDate(date, format, lang);\n };\n var dateParser = $dateParser({format: options.dateFormat, lang: lang, strict: options.strictFormat});\n\n var weekDaysMin = $dateFormatter.weekdaysShort(lang);\n var weekDaysLabels = weekDaysMin.slice(options.startWeek).concat(weekDaysMin.slice(0, options.startWeek));\n var weekDaysLabelsHtml = $sce.trustAsHtml('' + weekDaysLabels.join('') + '');\n\n var startDate = picker.$date || (options.startDate ? dateParser.getDateForAttribute('startDate', options.startDate) : new Date());\n var viewDate = {year: startDate.getFullYear(), month: startDate.getMonth(), date: startDate.getDate()};\n var timezoneOffset = startDate.getTimezoneOffset() * 6e4;\n\n var views = [{\n format: options.dayFormat,\n split: 7,\n steps: { month: 1 },\n update: function(date, force) {\n if(!this.built || force || date.getFullYear() !== viewDate.year || date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getDate() !== viewDate.date) {\n viewDate.date = picker.$date.getDate();\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstDayOfMonth = new Date(viewDate.year, viewDate.month, 1), firstDayOfMonthOffset = firstDayOfMonth.getTimezoneOffset();\n var firstDate = new Date(+firstDayOfMonth - mod(firstDayOfMonth.getDay() - options.startWeek, 7) * 864e5), firstDateOffset = firstDate.getTimezoneOffset();\n var today = new Date().toDateString();\n // Handle daylight time switch\n if(firstDateOffset !== firstDayOfMonthOffset) firstDate = new Date(+firstDate + (firstDateOffset - firstDayOfMonthOffset) * 60e3);\n var days = [], day;\n for(var i = 0; i < 42; i++) { // < 7 * 6\n day = dateParser.daylightSavingAdjust(new Date(firstDate.getFullYear(), firstDate.getMonth(), firstDate.getDate() + i));\n days.push({date: day, isToday: day.toDateString() === today, label: formatDate(day, this.format), selected: picker.$date && this.isSelected(day), muted: day.getMonth() !== viewDate.month, disabled: this.isDisabled(day)});\n }\n scope.title = formatDate(firstDayOfMonth, options.monthTitleFormat);\n scope.showLabels = true;\n scope.labels = weekDaysLabelsHtml;\n scope.rows = split(days, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth() && date.getDate() === picker.$date.getDate();\n },\n isDisabled: function(date) {\n var time = date.getTime();\n\n // Disabled because of min/max date.\n if (time < options.minDate || time > options.maxDate) return true;\n\n // Disabled due to being a disabled day of the week\n if (options.daysOfWeekDisabled.indexOf(date.getDay()) !== -1) return true;\n\n // Disabled because of disabled date range.\n if (options.disabledDateRanges) {\n for (var i = 0; i < options.disabledDateRanges.length; i++) {\n if (time >= options.disabledDateRanges[i].start && time <= options.disabledDateRanges[i].end) {\n return true;\n }\n }\n }\n\n return false;\n },\n onKeyDown: function(evt) {\n if (!picker.$date) {\n return;\n }\n var actualTime = picker.$date.getTime();\n var newDate;\n\n if(evt.keyCode === 37) newDate = new Date(actualTime - 1 * 864e5);\n else if(evt.keyCode === 38) newDate = new Date(actualTime - 7 * 864e5);\n else if(evt.keyCode === 39) newDate = new Date(actualTime + 1 * 864e5);\n else if(evt.keyCode === 40) newDate = new Date(actualTime + 7 * 864e5);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'month',\n format: options.monthFormat,\n split: 4,\n steps: { year: 1 },\n update: function(date, force) {\n if(!this.built || date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getMonth() !== viewDate.month) {\n angular.extend(viewDate, {month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstMonth = new Date(viewDate.year, 0, 1);\n var months = [], month;\n for (var i = 0; i < 12; i++) {\n month = new Date(viewDate.year, i, 1);\n months.push({date: month, label: formatDate(month, this.format), selected: picker.$isSelected(month), disabled: this.isDisabled(month)});\n }\n scope.title = formatDate(month, options.yearTitleFormat);\n scope.showLabels = false;\n scope.rows = split(months, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear() && date.getMonth() === picker.$date.getMonth();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear(), date.getMonth() + 1, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;\n },\n onKeyDown: function(evt) {\n if (!picker.$date) {\n return;\n }\n var actualMonth = picker.$date.getMonth();\n var newDate = new Date(picker.$date);\n\n if(evt.keyCode === 37) newDate.setMonth(actualMonth - 1);\n else if(evt.keyCode === 38) newDate.setMonth(actualMonth - 4);\n else if(evt.keyCode === 39) newDate.setMonth(actualMonth + 1);\n else if(evt.keyCode === 40) newDate.setMonth(actualMonth + 4);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }, {\n name: 'year',\n format: options.yearFormat,\n split: 4,\n steps: { year: 12 },\n update: function(date, force) {\n if(!this.built || force || parseInt(date.getFullYear()/20, 10) !== parseInt(viewDate.year/20, 10)) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$build();\n } else if(date.getFullYear() !== viewDate.year) {\n angular.extend(viewDate, {year: picker.$date.getFullYear(), month: picker.$date.getMonth(), date: picker.$date.getDate()});\n picker.$updateSelected();\n }\n },\n build: function() {\n var firstYear = viewDate.year - viewDate.year % (this.split * 3);\n var years = [], year;\n for (var i = 0; i < 12; i++) {\n year = new Date(firstYear + i, 0, 1);\n years.push({date: year, label: formatDate(year, this.format), selected: picker.$isSelected(year), disabled: this.isDisabled(year)});\n }\n scope.title = years[0].label + '-' + years[years.length - 1].label;\n scope.showLabels = false;\n scope.rows = split(years, this.split);\n this.built = true;\n },\n isSelected: function(date) {\n return picker.$date && date.getFullYear() === picker.$date.getFullYear();\n },\n isDisabled: function(date) {\n var lastDate = +new Date(date.getFullYear() + 1, 0, 0);\n return lastDate < options.minDate || date.getTime() > options.maxDate;\n },\n onKeyDown: function(evt) {\n if (!picker.$date) {\n return;\n }\n var actualYear = picker.$date.getFullYear(),\n newDate = new Date(picker.$date);\n\n if(evt.keyCode === 37) newDate.setYear(actualYear - 1);\n else if(evt.keyCode === 38) newDate.setYear(actualYear - 4);\n else if(evt.keyCode === 39) newDate.setYear(actualYear + 1);\n else if(evt.keyCode === 40) newDate.setYear(actualYear + 4);\n\n if (!this.isDisabled(newDate)) picker.select(newDate, true);\n }\n }];\n\n return {\n views: options.minView ? Array.prototype.slice.call(views, options.minView) : views,\n viewDate: viewDate\n };\n\n };\n\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.dropdown', ['mgcrea.ngStrap.tooltip'])\n\n .provider('$dropdown', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'dropdown',\n placement: 'bottom-left',\n template: 'dropdown/dropdown.tpl.html',\n trigger: 'click',\n container: false,\n keyboard: true,\n html: false,\n delay: 0\n };\n\n this.$get = function($window, $rootScope, $tooltip, $timeout) {\n\n var bodyEl = angular.element($window.document.body);\n var matchesSelector = Element.prototype.matchesSelector || Element.prototype.webkitMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector;\n\n function DropdownFactory(element, config) {\n\n var $dropdown = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n var scope = $dropdown.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n\n $dropdown = $tooltip(element, options);\n var parentEl = element.parent();\n\n // Protected methods\n\n $dropdown.$onKeyDown = function(evt) {\n if (!/(38|40)/.test(evt.keyCode)) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Retrieve focused index\n var items = angular.element($dropdown.$element[0].querySelectorAll('li:not(.divider) a'));\n if(!items.length) return;\n var index;\n angular.forEach(items, function(el, i) {\n if(matchesSelector && matchesSelector.call(el, ':focus')) index = i;\n });\n\n // Navigate with keyboard\n if(evt.keyCode === 38 && index > 0) index--;\n else if(evt.keyCode === 40 && index < items.length - 1) index++;\n else if(angular.isUndefined(index)) index = 0;\n items.eq(index)[0].focus();\n\n };\n\n // Overrides\n\n var show = $dropdown.show;\n $dropdown.show = function() {\n show();\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n options.keyboard && $dropdown.$element.on('keydown', $dropdown.$onKeyDown);\n bodyEl.on('click', onBodyClick);\n }, 0, false);\n parentEl.hasClass('dropdown') && parentEl.addClass('open');\n };\n\n var hide = $dropdown.hide;\n $dropdown.hide = function() {\n if(!$dropdown.$isShown) return;\n options.keyboard && $dropdown.$element.off('keydown', $dropdown.$onKeyDown);\n bodyEl.off('click', onBodyClick);\n parentEl.hasClass('dropdown') && parentEl.removeClass('open');\n hide();\n };\n\n var destroy = $dropdown.destroy;\n $dropdown.destroy = function() {\n bodyEl.off('click', onBodyClick);\n destroy();\n };\n\n // Private functions\n\n function onBodyClick(evt) {\n if(evt.target === element[0]) return;\n return evt.target !== element[0] && $dropdown.hide();\n }\n\n return $dropdown;\n\n }\n\n return DropdownFactory;\n\n };\n\n })\n\n .directive('bsDropdown', function($window, $sce, $dropdown) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as an object\n attr.bsDropdown && scope.$watch(attr.bsDropdown, function(newValue, oldValue) {\n scope.content = newValue;\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!dropdown || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(dropdown),?/i);\n newValue === true ? dropdown.show() : dropdown.hide();\n });\n\n // Initialize dropdown\n var dropdown = $dropdown(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (dropdown) dropdown.destroy();\n options = null;\n dropdown = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dateFormatter', [])\n\n .service('$dateFormatter', function($locale, dateFilter) {\n\n // The unused `lang` arguments are on purpose. The default implementation does not\n // use them and it always uses the locale loaded into the `$locale` service.\n // Custom implementations might use it, thus allowing different directives to\n // have different languages.\n\n this.getDefaultLocale = function() {\n return $locale.id;\n };\n\n // Format is either a data format name, e.g. \"shortTime\" or \"fullDate\", or a date format\n // Return either the corresponding date format or the given date format.\n this.getDatetimeFormat = function(format, lang) {\n return $locale.DATETIME_FORMATS[format] || format;\n };\n\n this.weekdaysShort = function(lang) {\n return $locale.DATETIME_FORMATS.SHORTDAY;\n };\n\n function splitTimeFormat(format) {\n return /(h+)([:\\.])?(m+)[ ]?(a?)/i.exec(format).slice(1);\n }\n\n // h:mm a => h\n this.hoursFormat = function(timeFormat) {\n return splitTimeFormat(timeFormat)[0];\n };\n\n // h:mm a => mm\n this.minutesFormat = function(timeFormat) {\n return splitTimeFormat(timeFormat)[2];\n };\n\n // h:mm a => :\n this.timeSeparator = function(timeFormat) {\n return splitTimeFormat(timeFormat)[1];\n };\n\n // h:mm a => true, H.mm => false\n this.showAM = function(timeFormat) {\n return !!splitTimeFormat(timeFormat)[3];\n };\n\n this.formatDate = function(date, format, lang){\n return dateFilter(date, format);\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dateParser', [])\n\n.provider('$dateParser', function($localeProvider) {\n\n // define a custom ParseDate object to use instead of native Date\n // to avoid date values wrapping when setting date component values\n function ParseDate() {\n this.year = 1970;\n this.month = 0;\n this.day = 1;\n this.hours = 0;\n this.minutes = 0;\n this.seconds = 0;\n this.milliseconds = 0;\n }\n\n ParseDate.prototype.setMilliseconds = function(value) { this.milliseconds = value; };\n ParseDate.prototype.setSeconds = function(value) { this.seconds = value; };\n ParseDate.prototype.setMinutes = function(value) { this.minutes = value; };\n ParseDate.prototype.setHours = function(value) { this.hours = value; };\n ParseDate.prototype.getHours = function() { return this.hours; };\n ParseDate.prototype.setDate = function(value) { this.day = value; };\n ParseDate.prototype.setMonth = function(value) { this.month = value; };\n ParseDate.prototype.setFullYear = function(value) { this.year = value; };\n ParseDate.prototype.fromDate = function(value) {\n this.year = value.getFullYear();\n this.month = value.getMonth();\n this.day = value.getDate();\n this.hours = value.getHours();\n this.minutes = value.getMinutes();\n this.seconds = value.getSeconds();\n this.milliseconds = value.getMilliseconds();\n return this;\n };\n\n ParseDate.prototype.toDate = function() {\n return new Date(this.year, this.month, this.day, this.hours, this.minutes, this.seconds, this.milliseconds);\n };\n\n var proto = ParseDate.prototype;\n\n function noop() {\n }\n\n function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function indexOfCaseInsensitive(array, value) {\n var len = array.length, str=value.toString().toLowerCase();\n for (var i=0; i 12 when midnight changeover, but then cannot generate\n * midnight datetime, so jump to 1AM, otherwise reset.\n * @param date (Date) the date to check\n * @return (Date) the corrected date\n *\n * __ copied from jquery ui datepicker __\n */\n $dateParser.daylightSavingAdjust = function(date) {\n if (!date) {\n return null;\n }\n date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\n return date;\n };\n\n // Private functions\n\n function setMapForFormat(format) {\n var keys = Object.keys(setFnMap), i;\n var map = [], sortedMap = [];\n // Map to setFn\n var clonedFormat = format;\n for(i = 0; i < keys.length; i++) {\n if(format.split(keys[i]).length > 1) {\n var index = clonedFormat.search(keys[i]);\n format = format.split(keys[i]).join('');\n if(setFnMap[keys[i]]) {\n map[index] = setFnMap[keys[i]];\n }\n }\n }\n // Sort result map\n angular.forEach(map, function(v) {\n // conditional required since angular.forEach broke around v1.2.21\n // related pr: https://github.com/angular/angular.js/pull/8525\n if(v) sortedMap.push(v);\n });\n return sortedMap;\n }\n\n function escapeReservedSymbols(text) {\n return text.replace(/\\//g, '[\\\\/]').replace('/-/g', '[-]').replace(/\\./g, '[.]').replace(/\\\\s/g, '[\\\\s]');\n }\n\n function regExpForFormat(format) {\n var keys = Object.keys(regExpMap), i;\n\n var re = format;\n // Abstract replaces to avoid collisions\n for(i = 0; i < keys.length; i++) {\n re = re.split(keys[i]).join('${' + i + '}');\n }\n // Replace abstracted values\n for(i = 0; i < keys.length; i++) {\n re = re.split('${' + i + '}').join('(' + regExpMap[keys[i]] + ')');\n }\n format = escapeReservedSymbols(format);\n\n return new RegExp('^' + re + '$', ['i']);\n }\n\n $dateParser.init();\n return $dateParser;\n\n };\n\n return DateParserFactory;\n\n };\n\n});\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.debounce', [])\n\n// @source jashkenas/underscore\n// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L693\n.factory('debounce', function($timeout) {\n return function(func, wait, immediate) {\n var timeout = null;\n return function() {\n var context = this,\n args = arguments,\n callNow = immediate && !timeout;\n if(timeout) {\n $timeout.cancel(timeout);\n }\n timeout = $timeout(function later() {\n timeout = null;\n if(!immediate) {\n func.apply(context, args);\n }\n }, wait, false);\n if(callNow) {\n func.apply(context, args);\n }\n return timeout;\n };\n };\n})\n\n\n// @source jashkenas/underscore\n// @url https://github.com/jashkenas/underscore/blob/1.5.2/underscore.js#L661\n.factory('throttle', function($timeout) {\n return function(func, wait, options) {\n var timeout = null;\n options || (options = {});\n return function() {\n var context = this,\n args = arguments;\n if(!timeout) {\n if(options.leading !== false) {\n func.apply(context, args);\n }\n timeout = $timeout(function later() {\n timeout = null;\n if(options.trailing !== false) {\n func.apply(context, args);\n }\n }, wait, false);\n }\n };\n };\n});\n\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.dimensions', [])\n\n .factory('dimensions', function($document, $window) {\n\n var jqLite = angular.element;\n var fn = {};\n\n /**\n * Test the element nodeName\n * @param element\n * @param name\n */\n var nodeName = fn.nodeName = function(element, name) {\n return element.nodeName && element.nodeName.toLowerCase() === name.toLowerCase();\n };\n\n /**\n * Returns the element computed style\n * @param element\n * @param prop\n * @param extra\n */\n fn.css = function(element, prop, extra) {\n var value;\n if (element.currentStyle) { //IE\n value = element.currentStyle[prop];\n } else if (window.getComputedStyle) {\n value = window.getComputedStyle(element)[prop];\n } else {\n value = element.style[prop];\n }\n return extra === true ? parseFloat(value) || 0 : value;\n };\n\n /**\n * Provides read-only equivalent of jQuery's offset function:\n * @required-by bootstrap-tooltip, bootstrap-affix\n * @url http://api.jquery.com/offset/\n * @param element\n */\n fn.offset = function(element) {\n var boxRect = element.getBoundingClientRect();\n var docElement = element.ownerDocument;\n return {\n width: boxRect.width || element.offsetWidth,\n height: boxRect.height || element.offsetHeight,\n top: boxRect.top + (window.pageYOffset || docElement.documentElement.scrollTop) - (docElement.documentElement.clientTop || 0),\n left: boxRect.left + (window.pageXOffset || docElement.documentElement.scrollLeft) - (docElement.documentElement.clientLeft || 0)\n };\n };\n\n /**\n * Provides read-only equivalent of jQuery's position function\n * @required-by bootstrap-tooltip, bootstrap-affix\n * @url http://api.jquery.com/offset/\n * @param element\n */\n fn.position = function(element) {\n\n var offsetParentRect = {top: 0, left: 0},\n offsetParentElement,\n offset;\n\n // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n if (fn.css(element, 'position') === 'fixed') {\n\n // We assume that getBoundingClientRect is available when computed position is fixed\n offset = element.getBoundingClientRect();\n\n } else {\n\n // Get *real* offsetParentElement\n offsetParentElement = offsetParent(element);\n\n // Get correct offsets\n offset = fn.offset(element);\n if (!nodeName(offsetParentElement, 'html')) {\n offsetParentRect = fn.offset(offsetParentElement);\n }\n\n // Add offsetParent borders\n offsetParentRect.top += fn.css(offsetParentElement, 'borderTopWidth', true);\n offsetParentRect.left += fn.css(offsetParentElement, 'borderLeftWidth', true);\n }\n\n // Subtract parent offsets and element margins\n return {\n width: element.offsetWidth,\n height: element.offsetHeight,\n top: offset.top - offsetParentRect.top - fn.css(element, 'marginTop', true),\n left: offset.left - offsetParentRect.left - fn.css(element, 'marginLeft', true)\n };\n\n };\n\n /**\n * Returns the closest, non-statically positioned offsetParent of a given element\n * @required-by fn.position\n * @param element\n */\n var offsetParent = function offsetParentElement(element) {\n var docElement = element.ownerDocument;\n var offsetParent = element.offsetParent || docElement;\n if(nodeName(offsetParent, '#document')) return docElement.documentElement;\n while(offsetParent && !nodeName(offsetParent, 'html') && fn.css(offsetParent, 'position') === 'static') {\n offsetParent = offsetParent.offsetParent;\n }\n return offsetParent || docElement.documentElement;\n };\n\n /**\n * Provides equivalent of jQuery's height function\n * @required-by bootstrap-affix\n * @url http://api.jquery.com/height/\n * @param element\n * @param outer\n */\n fn.height = function(element, outer) {\n var value = element.offsetHeight;\n if(outer) {\n value += fn.css(element, 'marginTop', true) + fn.css(element, 'marginBottom', true);\n } else {\n value -= fn.css(element, 'paddingTop', true) + fn.css(element, 'paddingBottom', true) + fn.css(element, 'borderTopWidth', true) + fn.css(element, 'borderBottomWidth', true);\n }\n return value;\n };\n\n /**\n * Provides equivalent of jQuery's width function\n * @required-by bootstrap-affix\n * @url http://api.jquery.com/width/\n * @param element\n * @param outer\n */\n fn.width = function(element, outer) {\n var value = element.offsetWidth;\n if(outer) {\n value += fn.css(element, 'marginLeft', true) + fn.css(element, 'marginRight', true);\n } else {\n value -= fn.css(element, 'paddingLeft', true) + fn.css(element, 'paddingRight', true) + fn.css(element, 'borderLeftWidth', true) + fn.css(element, 'borderRightWidth', true);\n }\n return value;\n };\n\n return fn;\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.helpers.parseOptions', [])\n\n .provider('$parseOptions', function() {\n\n var defaults = this.defaults = {\n regexp: /^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+(.*?)(?:\\s+track\\s+by\\s+(.*?))?$/\n };\n\n this.$get = function($parse, $q) {\n\n function ParseOptionsFactory(attr, config) {\n\n var $parseOptions = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n $parseOptions.$values = [];\n\n // Private vars\n var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;\n\n $parseOptions.init = function() {\n $parseOptions.$match = match = attr.match(options.regexp);\n displayFn = $parse(match[2] || match[1]),\n valueName = match[4] || match[6],\n keyName = match[5],\n groupByFn = $parse(match[3] || ''),\n valueFn = $parse(match[2] ? match[1] : valueName),\n valuesFn = $parse(match[7]);\n };\n\n $parseOptions.valuesFn = function(scope, controller) {\n return $q.when(valuesFn(scope, controller))\n .then(function(values) {\n $parseOptions.$values = values ? parseValues(values, scope) : {};\n return $parseOptions.$values;\n });\n };\n\n $parseOptions.displayValue = function(modelValue) {\n var scope = {};\n scope[valueName] = modelValue;\n return displayFn(scope);\n };\n\n // Private functions\n\n function parseValues(values, scope) {\n return values.map(function(match, index) {\n var locals = {}, label, value;\n locals[valueName] = match;\n label = displayFn(scope, locals);\n value = valueFn(scope, locals);\n return {label: label, value: value, index: index};\n });\n }\n\n $parseOptions.init();\n return $parseOptions;\n\n }\n\n return ParseOptionsFactory;\n\n };\n\n });\n","'use strict';\n\n(angular.version.minor < 3 && angular.version.dot < 14) && angular.module('ng')\n\n.factory('$$rAF', function($window, $timeout) {\n\n var requestAnimationFrame = $window.requestAnimationFrame ||\n $window.webkitRequestAnimationFrame ||\n $window.mozRequestAnimationFrame;\n\n var cancelAnimationFrame = $window.cancelAnimationFrame ||\n $window.webkitCancelAnimationFrame ||\n $window.mozCancelAnimationFrame ||\n $window.webkitCancelRequestAnimationFrame;\n\n var rafSupported = !!requestAnimationFrame;\n var raf = rafSupported ?\n function(fn) {\n var id = requestAnimationFrame(fn);\n return function() {\n cancelAnimationFrame(id);\n };\n } :\n function(fn) {\n var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n return function() {\n $timeout.cancel(timer);\n };\n };\n\n raf.supported = rafSupported;\n\n return raf;\n\n});\n\n// .factory('$$animateReflow', function($$rAF, $document) {\n\n// var bodyEl = $document[0].body;\n\n// return function(fn) {\n// //the returned function acts as the cancellation function\n// return $$rAF(function() {\n// //the line below will force the browser to perform a repaint\n// //so that all the animated elements within the animation frame\n// //will be properly updated and drawn on screen. This is\n// //required to perform multi-class CSS based animations with\n// //Firefox. DO NOT REMOVE THIS LINE.\n// var a = bodyEl.offsetWidth + 1;\n// fn();\n// });\n// };\n\n// });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.modal', ['mgcrea.ngStrap.helpers.dimensions'])\n\n .provider('$modal', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n backdropAnimation: 'am-fade',\n prefixClass: 'modal',\n prefixEvent: 'modal',\n placement: 'top',\n template: 'modal/modal.tpl.html',\n contentTemplate: false,\n container: false,\n element: null,\n backdrop: true,\n keyboard: true,\n html: false,\n show: true\n };\n\n this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $timeout, $sce, dimensions) {\n\n var forEach = angular.forEach;\n var trim = String.prototype.trim;\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n var bodyElement = angular.element($window.document.body);\n var htmlReplaceRegExp = /ng-bind=\"/ig;\n\n function ModalFactory(config) {\n\n var $modal = {};\n\n // Common vars\n var options = $modal.$options = angular.extend({}, defaults, config);\n $modal.$promise = fetchTemplate(options.template);\n var scope = $modal.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n if(!options.element && !options.container) {\n options.container = 'body';\n }\n\n // store $id to identify the triggering element in events\n // give priority to options.id, otherwise, try to use\n // element id if defined\n $modal.$id = options.id || options.element && options.element.attr('id') || '';\n\n // Support scope as string options\n forEach(['title', 'content'], function(key) {\n if(options[key]) scope[key] = $sce.trustAsHtml(options[key]);\n });\n\n // Provide scope helpers\n scope.$hide = function() {\n scope.$$postDigest(function() {\n $modal.hide();\n });\n };\n scope.$show = function() {\n scope.$$postDigest(function() {\n $modal.show();\n });\n };\n scope.$toggle = function() {\n scope.$$postDigest(function() {\n $modal.toggle();\n });\n };\n // Publish isShown as a protected var on scope\n $modal.$isShown = scope.$isShown = false;\n\n // Support contentTemplate option\n if(options.contentTemplate) {\n $modal.$promise = $modal.$promise.then(function(template) {\n var templateEl = angular.element(template);\n return fetchTemplate(options.contentTemplate)\n .then(function(contentTemplate) {\n var contentEl = findElement('[ng-bind=\"content\"]', templateEl[0]).removeAttr('ng-bind').html(contentTemplate);\n // Drop the default footer as you probably don't want it if you use a custom contentTemplate\n if(!config.template) contentEl.next().remove();\n return templateEl[0].outerHTML;\n });\n });\n }\n\n // Fetch, compile then initialize modal\n var modalLinker, modalElement;\n var backdropElement = angular.element('
    ');\n $modal.$promise.then(function(template) {\n if(angular.isObject(template)) template = template.data;\n if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html=\"');\n template = trim.apply(template);\n modalLinker = $compile(template);\n $modal.init();\n });\n\n $modal.init = function() {\n\n // Options: show\n if(options.show) {\n scope.$$postDigest(function() {\n $modal.show();\n });\n }\n\n };\n\n $modal.destroy = function() {\n\n // Remove element\n if(modalElement) {\n modalElement.remove();\n modalElement = null;\n }\n if(backdropElement) {\n backdropElement.remove();\n backdropElement = null;\n }\n\n // Destroy scope\n scope.$destroy();\n\n };\n\n $modal.show = function() {\n if($modal.$isShown) return;\n\n if(scope.$emit(options.prefixEvent + '.show.before', $modal).defaultPrevented) {\n return;\n }\n var parent, after;\n if(angular.isElement(options.container)) {\n parent = options.container;\n after = options.container[0].lastChild ? angular.element(options.container[0].lastChild) : null;\n } else {\n if (options.container) {\n parent = findElement(options.container);\n after = parent[0].lastChild ? angular.element(parent[0].lastChild) : null;\n } else {\n parent = null;\n after = options.element;\n }\n }\n\n // Fetch a cloned element linked from template\n modalElement = $modal.$element = modalLinker(scope, function(clonedElement, scope) {});\n\n // Set the initial positioning.\n modalElement.css({display: 'block'}).addClass(options.placement);\n\n // Options: animation\n if(options.animation) {\n if(options.backdrop) {\n backdropElement.addClass(options.backdropAnimation);\n }\n modalElement.addClass(options.animation);\n }\n\n if(options.backdrop) {\n $animate.enter(backdropElement, bodyElement, null);\n }\n // Support v1.3+ $animate\n // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9\n var promise = $animate.enter(modalElement, parent, after, enterAnimateCallback);\n if(promise && promise.then) promise.then(enterAnimateCallback);\n\n $modal.$isShown = scope.$isShown = true;\n safeDigest(scope);\n // Focus once the enter-animation has started\n // Weird PhantomJS bug hack\n var el = modalElement[0];\n requestAnimationFrame(function() {\n el.focus();\n });\n\n bodyElement.addClass(options.prefixClass + '-open');\n if(options.animation) {\n bodyElement.addClass(options.prefixClass + '-with-' + options.animation);\n }\n\n // Bind events\n if(options.backdrop) {\n modalElement.on('click', hideOnBackdropClick);\n backdropElement.on('click', hideOnBackdropClick);\n backdropElement.on('wheel', preventEventDefault);\n }\n if(options.keyboard) {\n modalElement.on('keyup', $modal.$onKeyUp);\n }\n };\n\n function enterAnimateCallback() {\n scope.$emit(options.prefixEvent + '.show', $modal);\n }\n\n $modal.hide = function() {\n if(!$modal.$isShown) return;\n\n if(scope.$emit(options.prefixEvent + '.hide.before', $modal).defaultPrevented) {\n return;\n }\n var promise = $animate.leave(modalElement, leaveAnimateCallback);\n // Support v1.3+ $animate\n // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9\n if(promise && promise.then) promise.then(leaveAnimateCallback);\n\n if(options.backdrop) {\n $animate.leave(backdropElement);\n }\n $modal.$isShown = scope.$isShown = false;\n safeDigest(scope);\n\n // Unbind events\n if(options.backdrop) {\n modalElement.off('click', hideOnBackdropClick);\n backdropElement.off('click', hideOnBackdropClick);\n backdropElement.off('wheel', preventEventDefault);\n }\n if(options.keyboard) {\n modalElement.off('keyup', $modal.$onKeyUp);\n }\n };\n\n function leaveAnimateCallback() {\n scope.$emit(options.prefixEvent + '.hide', $modal);\n bodyElement.removeClass(options.prefixClass + '-open');\n if(options.animation) {\n bodyElement.removeClass(options.prefixClass + '-with-' + options.animation);\n }\n }\n\n $modal.toggle = function() {\n\n $modal.$isShown ? $modal.hide() : $modal.show();\n\n };\n\n $modal.focus = function() {\n modalElement[0].focus();\n };\n\n // Protected methods\n\n $modal.$onKeyUp = function(evt) {\n\n if (evt.which === 27 && $modal.$isShown) {\n $modal.hide();\n evt.stopPropagation();\n }\n\n };\n\n // Private methods\n\n function hideOnBackdropClick(evt) {\n if(evt.target !== evt.currentTarget) return;\n options.backdrop === 'static' ? $modal.focus() : $modal.hide();\n }\n\n function preventEventDefault(evt) {\n evt.preventDefault();\n }\n\n return $modal;\n\n }\n\n // Helper functions\n\n function safeDigest(scope) {\n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n }\n\n function findElement(query, element) {\n return angular.element((element || document).querySelectorAll(query));\n }\n\n var fetchPromises = {};\n function fetchTemplate(template) {\n if(fetchPromises[template]) return fetchPromises[template];\n return (fetchPromises[template] = $q.when($templateCache.get(template) || $http.get(template))\n .then(function(res) {\n if(angular.isObject(res)) {\n $templateCache.put(template, res.data);\n return res.data;\n }\n return res;\n }));\n }\n\n return ModalFactory;\n\n };\n\n })\n\n .directive('bsModal', function($window, $sce, $modal) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope, element: element, show: false};\n angular.forEach(['template', 'contentTemplate', 'placement', 'backdrop', 'keyboard', 'html', 'container', 'animation', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n });\n });\n\n // Support scope as an object\n attr.bsModal && scope.$watch(attr.bsModal, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n }, true);\n\n // Initialize modal\n var modal = $modal(options);\n\n // Trigger\n element.on(attr.trigger || 'click', modal.toggle);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (modal) modal.destroy();\n options = null;\n modal = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.navbar', [])\n\n .provider('$navbar', function() {\n\n var defaults = this.defaults = {\n activeClass: 'active',\n routeAttr: 'data-match-route',\n strict: false\n };\n\n this.$get = function() {\n return {defaults: defaults};\n };\n\n })\n\n .directive('bsNavbar', function($window, $location, $navbar) {\n\n var defaults = $navbar.defaults;\n\n return {\n restrict: 'A',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = angular.copy(defaults);\n angular.forEach(Object.keys(defaults), function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Watch for the $location\n scope.$watch(function() {\n\n return $location.path();\n\n }, function(newValue, oldValue) {\n\n var liElements = element[0].querySelectorAll('li[' + options.routeAttr + ']');\n\n angular.forEach(liElements, function(li) {\n\n var liElement = angular.element(li);\n var pattern = liElement.attr(options.routeAttr).replace('/', '\\\\/');\n if(options.strict) {\n pattern = '^' + pattern + '$';\n }\n var regexp = new RegExp(pattern, ['i']);\n\n if(regexp.test(newValue)) {\n liElement.addClass(options.activeClass);\n } else {\n liElement.removeClass(options.activeClass);\n }\n\n });\n\n });\n\n }\n\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.popover', ['mgcrea.ngStrap.tooltip'])\n\n .provider('$popover', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n customClass: '',\n container: false,\n target: false,\n placement: 'right',\n template: 'popover/popover.tpl.html',\n contentTemplate: false,\n trigger: 'click',\n keyboard: true,\n html: false,\n title: '',\n content: '',\n delay: 0,\n autoClose: false\n };\n\n this.$get = function($tooltip) {\n\n function PopoverFactory(element, config) {\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n var $popover = $tooltip(element, options);\n\n // Support scope as string options [/*title, */content]\n if(options.content) {\n $popover.$scope.content = options.content;\n }\n\n return $popover;\n\n }\n\n return PopoverFactory;\n\n };\n\n })\n\n .directive('bsPopover', function($window, $sce, $popover) {\n\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'customClass', 'autoClose', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Support scope as data-attrs\n angular.forEach(['title', 'content'], function(key) {\n attr[key] && attr.$observe(key, function(newValue, oldValue) {\n scope[key] = $sce.trustAsHtml(newValue);\n angular.isDefined(oldValue) && requestAnimationFrame(function() {\n popover && popover.$applyPlacement();\n });\n });\n });\n\n // Support scope as an object\n attr.bsPopover && scope.$watch(attr.bsPopover, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.content = newValue;\n }\n angular.isDefined(oldValue) && requestAnimationFrame(function() {\n popover && popover.$applyPlacement();\n });\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!popover || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(popover),?/i);\n newValue === true ? popover.show() : popover.hide();\n });\n\n // Initialize popover\n var popover = $popover(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (popover) popover.destroy();\n options = null;\n popover = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.select', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n .provider('$select', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'select',\n prefixEvent: '$select',\n placement: 'bottom-left',\n template: 'select/select.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n multiple: false,\n allNoneButtons: false,\n sort: true,\n caretHtml: ' ',\n placeholder: 'Choose among the following...',\n allText: 'All',\n noneText: 'None',\n maxLength: 3,\n maxLengthHtml: 'selected',\n iconCheckmark: 'glyphicon glyphicon-ok'\n };\n\n this.$get = function($window, $document, $rootScope, $tooltip, $timeout) {\n\n var bodyEl = angular.element($window.document.body);\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isTouch = ('createTouch' in $window.document) && isNative;\n\n function SelectFactory(element, controller, config) {\n\n var $select = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $select = $tooltip(element, options);\n var scope = $select.$scope;\n\n scope.$matches = [];\n scope.$activeIndex = 0;\n scope.$isMultiple = options.multiple;\n scope.$showAllNoneButtons = options.allNoneButtons && options.multiple;\n scope.$iconCheckmark = options.iconCheckmark;\n scope.$allText = options.allText;\n scope.$noneText = options.noneText;\n\n scope.$activate = function(index) {\n scope.$$postDigest(function() {\n $select.activate(index);\n });\n };\n\n scope.$select = function(index, evt) {\n scope.$$postDigest(function() {\n $select.select(index);\n });\n };\n\n scope.$isVisible = function() {\n return $select.$isVisible();\n };\n\n scope.$isActive = function(index) {\n return $select.$isActive(index);\n };\n\n scope.$selectAll = function () {\n for (var i = 0; i < scope.$matches.length; i++) {\n if (!scope.$isActive(i)) {\n scope.$select(i);\n }\n }\n };\n\n scope.$selectNone = function () {\n for (var i = 0; i < scope.$matches.length; i++) {\n if (scope.$isActive(i)) {\n scope.$select(i);\n }\n }\n };\n\n // Public methods\n\n $select.update = function(matches) {\n scope.$matches = matches;\n $select.$updateActiveIndex();\n };\n\n $select.activate = function(index) {\n if(options.multiple) {\n scope.$activeIndex.sort();\n $select.$isActive(index) ? scope.$activeIndex.splice(scope.$activeIndex.indexOf(index), 1) : scope.$activeIndex.push(index);\n if(options.sort) scope.$activeIndex.sort();\n } else {\n scope.$activeIndex = index;\n }\n return scope.$activeIndex;\n };\n\n $select.select = function(index) {\n var value = scope.$matches[index].value;\n scope.$apply(function() {\n $select.activate(index);\n if(options.multiple) {\n controller.$setViewValue(scope.$activeIndex.map(function(index) {\n return scope.$matches[index].value;\n }));\n } else {\n controller.$setViewValue(value);\n // Hide if single select\n $select.hide();\n }\n });\n // Emit event\n scope.$emit(options.prefixEvent + '.select', value, index, $select);\n };\n\n // Protected methods\n\n $select.$updateActiveIndex = function() {\n if(controller.$modelValue && scope.$matches.length) {\n if(options.multiple && angular.isArray(controller.$modelValue)) {\n scope.$activeIndex = controller.$modelValue.map(function(value) {\n return $select.$getIndex(value);\n });\n } else {\n scope.$activeIndex = $select.$getIndex(controller.$modelValue);\n }\n } else if(scope.$activeIndex >= scope.$matches.length) {\n scope.$activeIndex = options.multiple ? [] : 0;\n }\n };\n\n $select.$isVisible = function() {\n if(!options.minLength || !controller) {\n return scope.$matches.length;\n }\n // minLength support\n return scope.$matches.length && controller.$viewValue.length >= options.minLength;\n };\n\n $select.$isActive = function(index) {\n if(options.multiple) {\n return scope.$activeIndex.indexOf(index) !== -1;\n } else {\n return scope.$activeIndex === index;\n }\n };\n\n $select.$getIndex = function(value) {\n var l = scope.$matches.length, i = l;\n if(!l) return;\n for(i = l; i--;) {\n if(scope.$matches[i].value === value) break;\n }\n if(i < 0) return;\n return i;\n };\n\n $select.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n targetEl.triggerHandler('click');\n }\n };\n\n $select.$onKeyDown = function(evt) {\n if (!/(9|13|38|40)/.test(evt.keyCode)) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Select with enter\n if(!options.multiple && (evt.keyCode === 13 || evt.keyCode === 9)) {\n return $select.select(scope.$activeIndex);\n }\n\n // Navigate with keyboard\n if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n scope.$digest();\n };\n\n // Overrides\n\n var _show = $select.show;\n $select.show = function() {\n _show();\n if(options.multiple) {\n $select.$element.addClass('select-multiple');\n }\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n $select.$element.on(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $select.$onKeyDown);\n }\n }, 0, false);\n };\n\n var _hide = $select.hide;\n $select.hide = function() {\n $select.$element.off(isTouch ? 'touchstart' : 'mousedown', $select.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $select.$onKeyDown);\n }\n _hide(true);\n };\n\n return $select;\n\n }\n\n SelectFactory.defaults = defaults;\n return SelectFactory;\n\n };\n\n })\n\n .directive('bsSelect', function($window, $parse, $q, $select, $parseOptions) {\n\n var defaults = $select.defaults;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, placeholder: defaults.placeholder};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'placeholder', 'multiple', 'allNoneButtons', 'maxLength', 'maxLengthHtml', 'allText', 'noneText', 'iconCheckmark', 'autoClose', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Add support for select markup\n if(element[0].nodeName.toLowerCase() === 'select') {\n var inputEl = element;\n inputEl.css('display', 'none');\n element = angular.element('');\n inputEl.after(element);\n }\n\n // Build proper ngOptions\n var parsedOptions = $parseOptions(attr.ngOptions);\n\n // Initialize select\n var select = $select(element, controller, options);\n\n // Watch ngOptions values before filtering for changes\n var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').trim();\n scope.$watch(watchedOptions, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n parsedOptions.valuesFn(scope, controller)\n .then(function(values) {\n select.update(values);\n controller.$render();\n });\n }, true);\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue);\n select.$updateActiveIndex();\n controller.$render();\n }, true);\n\n // Model rendering in view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n var selected, index;\n if(options.multiple && angular.isArray(controller.$modelValue)) {\n selected = controller.$modelValue.map(function(value) {\n index = select.$getIndex(value);\n return angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n }).filter(angular.isDefined);\n if(selected.length > (options.maxLength || defaults.maxLength)) {\n selected = selected.length + ' ' + (options.maxLengthHtml || defaults.maxLengthHtml);\n } else {\n selected = selected.join(', ');\n }\n } else {\n index = select.$getIndex(controller.$modelValue);\n selected = angular.isDefined(index) ? select.$scope.$matches[index].label : false;\n }\n element.html((selected ? selected : options.placeholder) + defaults.caretHtml);\n };\n\n if(options.multiple){\n controller.$isEmpty = function(value){\n return !value || value.length === 0;\n };\n }\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (select) select.destroy();\n options = null;\n select = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.tab', [])\n\n .provider('$tab', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n template: 'tab/tab.tpl.html',\n navClass: 'nav-tabs',\n activeClass: 'active'\n };\n\n var controller = this.controller = function($scope, $element, $attrs) {\n var self = this;\n\n // Attributes options\n self.$options = angular.copy(defaults);\n angular.forEach(['animation', 'navClass', 'activeClass'], function(key) {\n if(angular.isDefined($attrs[key])) self.$options[key] = $attrs[key];\n });\n\n // Publish options on scope\n $scope.$navClass = self.$options.navClass;\n $scope.$activeClass = self.$options.activeClass;\n\n self.$panes = $scope.$panes = [];\n\n // DEPRECATED: $viewChangeListeners, please use $activePaneChangeListeners\n // Because we deprecated ngModel usage, we rename viewChangeListeners to \n // activePaneChangeListeners to make more sense.\n self.$activePaneChangeListeners = self.$viewChangeListeners = [];\n\n self.$push = function(pane) {\n self.$panes.push(pane);\n };\n\n self.$remove = function(pane) {\n var index = self.$panes.indexOf(pane);\n var activeIndex = self.$panes.$active;\n\n // remove pane from $panes array\n self.$panes.splice(index, 1);\n\n if (index < activeIndex) {\n // we removed a pane before the active pane, so we need to \n // decrement the active pane index\n activeIndex--;\n }\n else if (index === activeIndex && activeIndex === self.$panes.length) {\n // we remove the active pane and it was the one at the end,\n // so select the previous one\n activeIndex--;\n }\n self.$setActive(activeIndex);\n };\n\n self.$panes.$active = 0;\n self.$setActive = $scope.$setActive = function(value) {\n self.$panes.$active = value;\n self.$activePaneChangeListeners.forEach(function(fn) {\n fn();\n });\n };\n\n };\n\n this.$get = function() {\n var $tab = {};\n $tab.defaults = defaults;\n $tab.controller = controller;\n return $tab;\n };\n\n })\n\n .directive('bsTabs', function($window, $animate, $tab, $parse) {\n\n var defaults = $tab.defaults;\n\n return {\n require: ['?ngModel', 'bsTabs'],\n transclude: true,\n scope: true,\n controller: ['$scope', '$element', '$attrs', $tab.controller],\n templateUrl: function(element, attr) {\n return attr.template || defaults.template;\n },\n link: function postLink(scope, element, attrs, controllers) {\n\n var ngModelCtrl = controllers[0];\n var bsTabsCtrl = controllers[1];\n\n // DEPRECATED: ngModel, please use bsActivePane\n // 'ngModel' is deprecated bacause if interferes with form validation\n // and status, so avoid using it here.\n if(ngModelCtrl) {\n console.warn('Usage of ngModel is deprecated, please use bsActivePane instead!');\n\n // Update the modelValue following\n bsTabsCtrl.$activePaneChangeListeners.push(function() {\n ngModelCtrl.$setViewValue(bsTabsCtrl.$panes.$active);\n });\n\n // modelValue -> $formatters -> viewValue\n ngModelCtrl.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n bsTabsCtrl.$setActive(modelValue * 1);\n return modelValue;\n });\n\n }\n\n if (attrs.bsActivePane) {\n // adapted from angularjs ngModelController bindings\n // https://github.com/angular/angular.js/blob/v1.3.1/src%2Fng%2Fdirective%2Finput.js#L1730\n var parsedBsActivePane = $parse(attrs.bsActivePane);\n\n // Update bsActivePane value with change\n bsTabsCtrl.$activePaneChangeListeners.push(function() {\n parsedBsActivePane.assign(scope, bsTabsCtrl.$panes.$active);\n });\n\n // watch bsActivePane for value changes\n scope.$watch(attrs.bsActivePane, function(newValue, oldValue) {\n bsTabsCtrl.$setActive(newValue * 1);\n }, true);\n }\n }\n };\n\n })\n\n .directive('bsPane', function($window, $animate, $sce) {\n\n return {\n require: ['^?ngModel', '^bsTabs'],\n scope: true,\n link: function postLink(scope, element, attrs, controllers) {\n\n var ngModelCtrl = controllers[0];\n var bsTabsCtrl = controllers[1];\n\n // Add base class\n element.addClass('tab-pane');\n\n // Observe title attribute for change\n attrs.$observe('title', function(newValue, oldValue) {\n scope.title = $sce.trustAsHtml(newValue);\n });\n\n // Add animation class\n if(bsTabsCtrl.$options.animation) {\n element.addClass(bsTabsCtrl.$options.animation);\n }\n\n // Push pane to parent bsTabs controller\n bsTabsCtrl.$push(scope);\n\n // remove pane from tab controller when pane is destroyed\n scope.$on('$destroy', function() {\n bsTabsCtrl.$remove(scope);\n });\n\n function render() {\n var index = bsTabsCtrl.$panes.indexOf(scope);\n var active = bsTabsCtrl.$panes.$active;\n $animate[index === active ? 'addClass' : 'removeClass'](element, bsTabsCtrl.$options.activeClass);\n }\n\n bsTabsCtrl.$activePaneChangeListeners.push(function() {\n render();\n });\n render();\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.scrollspy', ['mgcrea.ngStrap.helpers.debounce', 'mgcrea.ngStrap.helpers.dimensions'])\n\n .provider('$scrollspy', function() {\n\n // Pool of registered spies\n var spies = this.$$spies = {};\n\n var defaults = this.defaults = {\n debounce: 150,\n throttle: 100,\n offset: 100\n };\n\n this.$get = function($window, $document, $rootScope, dimensions, debounce, throttle) {\n\n var windowEl = angular.element($window);\n var docEl = angular.element($document.prop('documentElement'));\n var bodyEl = angular.element($window.document.body);\n\n // Helper functions\n\n function nodeName(element, name) {\n return element[0].nodeName && element[0].nodeName.toLowerCase() === name.toLowerCase();\n }\n\n function ScrollSpyFactory(config) {\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n if(!options.element) options.element = bodyEl;\n var isWindowSpy = nodeName(options.element, 'body');\n var scrollEl = isWindowSpy ? windowEl : options.element;\n var scrollId = isWindowSpy ? 'window' : options.id;\n\n // Use existing spy\n if(spies[scrollId]) {\n spies[scrollId].$$count++;\n return spies[scrollId];\n }\n\n var $scrollspy = {};\n\n // Private vars\n var unbindViewContentLoaded, unbindIncludeContentLoaded;\n var trackedElements = $scrollspy.$trackedElements = [];\n var sortedElements = [];\n var activeTarget;\n var debouncedCheckPosition;\n var throttledCheckPosition;\n var debouncedCheckOffsets;\n var viewportHeight;\n var scrollTop;\n\n $scrollspy.init = function() {\n\n // Setup internal ref counter\n this.$$count = 1;\n\n // Bind events\n debouncedCheckPosition = debounce(this.checkPosition, options.debounce);\n throttledCheckPosition = throttle(this.checkPosition, options.throttle);\n scrollEl.on('click', this.checkPositionWithEventLoop);\n windowEl.on('resize', debouncedCheckPosition);\n scrollEl.on('scroll', throttledCheckPosition);\n\n debouncedCheckOffsets = debounce(this.checkOffsets, options.debounce);\n unbindViewContentLoaded = $rootScope.$on('$viewContentLoaded', debouncedCheckOffsets);\n unbindIncludeContentLoaded = $rootScope.$on('$includeContentLoaded', debouncedCheckOffsets);\n debouncedCheckOffsets();\n\n // Register spy for reuse\n if(scrollId) {\n spies[scrollId] = $scrollspy;\n }\n\n };\n\n $scrollspy.destroy = function() {\n\n // Check internal ref counter\n this.$$count--;\n if(this.$$count > 0) {\n return;\n }\n\n // Unbind events\n scrollEl.off('click', this.checkPositionWithEventLoop);\n windowEl.off('resize', debouncedCheckPosition);\n scrollEl.off('scroll', throttledCheckPosition);\n unbindViewContentLoaded();\n unbindIncludeContentLoaded();\n if (scrollId) {\n delete spies[scrollId];\n }\n };\n\n $scrollspy.checkPosition = function() {\n\n // Not ready yet\n if(!sortedElements.length) return;\n\n // Calculate the scroll position\n scrollTop = (isWindowSpy ? $window.pageYOffset : scrollEl.prop('scrollTop')) || 0;\n\n // Calculate the viewport height for use by the components\n viewportHeight = Math.max($window.innerHeight, docEl.prop('clientHeight'));\n\n // Activate first element if scroll is smaller\n if(scrollTop < sortedElements[0].offsetTop && activeTarget !== sortedElements[0].target) {\n return $scrollspy.$activateElement(sortedElements[0]);\n }\n\n // Activate proper element\n for (var i = sortedElements.length; i--;) {\n if(angular.isUndefined(sortedElements[i].offsetTop) || sortedElements[i].offsetTop === null) continue;\n if(activeTarget === sortedElements[i].target) continue;\n if(scrollTop < sortedElements[i].offsetTop) continue;\n if(sortedElements[i + 1] && scrollTop > sortedElements[i + 1].offsetTop) continue;\n return $scrollspy.$activateElement(sortedElements[i]);\n }\n\n };\n\n $scrollspy.checkPositionWithEventLoop = function() {\n // IE 9 throws an error if we use 'this' instead of '$scrollspy'\n // in this setTimeout call\n setTimeout($scrollspy.checkPosition, 1);\n };\n\n // Protected methods\n\n $scrollspy.$activateElement = function(element) {\n if(activeTarget) {\n var activeElement = $scrollspy.$getTrackedElement(activeTarget);\n if(activeElement) {\n activeElement.source.removeClass('active');\n if(nodeName(activeElement.source, 'li') && nodeName(activeElement.source.parent().parent(), 'li')) {\n activeElement.source.parent().parent().removeClass('active');\n }\n }\n }\n activeTarget = element.target;\n element.source.addClass('active');\n if(nodeName(element.source, 'li') && nodeName(element.source.parent().parent(), 'li')) {\n element.source.parent().parent().addClass('active');\n }\n };\n\n $scrollspy.$getTrackedElement = function(target) {\n return trackedElements.filter(function(obj) {\n return obj.target === target;\n })[0];\n };\n\n // Track offsets behavior\n\n $scrollspy.checkOffsets = function() {\n\n angular.forEach(trackedElements, function(trackedElement) {\n var targetElement = document.querySelector(trackedElement.target);\n trackedElement.offsetTop = targetElement ? dimensions.offset(targetElement).top : null;\n if(options.offset && trackedElement.offsetTop !== null) trackedElement.offsetTop -= options.offset * 1;\n });\n\n sortedElements = trackedElements\n .filter(function(el) {\n return el.offsetTop !== null;\n })\n .sort(function(a, b) {\n return a.offsetTop - b.offsetTop;\n });\n\n debouncedCheckPosition();\n\n };\n\n $scrollspy.trackElement = function(target, source) {\n trackedElements.push({target: target, source: source});\n };\n\n $scrollspy.untrackElement = function(target, source) {\n var toDelete;\n for (var i = trackedElements.length; i--;) {\n if(trackedElements[i].target === target && trackedElements[i].source === source) {\n toDelete = i;\n break;\n }\n }\n trackedElements = trackedElements.splice(toDelete, 1);\n };\n\n $scrollspy.activate = function(i) {\n trackedElements[i].addClass('active');\n };\n\n // Initialize plugin\n\n $scrollspy.init();\n return $scrollspy;\n\n }\n\n return ScrollSpyFactory;\n\n };\n\n })\n\n .directive('bsScrollspy', function($rootScope, debounce, dimensions, $scrollspy) {\n\n return {\n restrict: 'EAC',\n link: function postLink(scope, element, attr) {\n\n var options = {scope: scope};\n angular.forEach(['offset', 'target'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n var scrollspy = $scrollspy(options);\n scrollspy.trackElement(options.target, element);\n\n scope.$on('$destroy', function() {\n if (scrollspy) {\n scrollspy.untrackElement(options.target, element);\n scrollspy.destroy();\n }\n options = null;\n scrollspy = null;\n });\n\n }\n };\n\n })\n\n\n .directive('bsScrollspyList', function($rootScope, debounce, dimensions, $scrollspy) {\n\n return {\n restrict: 'A',\n compile: function postLink(element, attr) {\n var children = element[0].querySelectorAll('li > a[href]');\n angular.forEach(children, function(child) {\n var childEl = angular.element(child);\n childEl.parent().attr('bs-scrollspy', '').attr('data-target', childEl.attr('href'));\n });\n }\n\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.timepicker', [\n 'mgcrea.ngStrap.helpers.dateParser',\n 'mgcrea.ngStrap.helpers.dateFormatter',\n 'mgcrea.ngStrap.tooltip'])\n\n .provider('$timepicker', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'timepicker',\n placement: 'bottom-left',\n template: 'timepicker/timepicker.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n // lang: $locale.id,\n useNative: true,\n timeType: 'date',\n timeFormat: 'shortTime',\n modelTimeFormat: null,\n autoclose: false,\n minTime: -Infinity,\n maxTime: +Infinity,\n length: 5,\n hourStep: 1,\n minuteStep: 5,\n iconUp: 'glyphicon glyphicon-chevron-up',\n iconDown: 'glyphicon glyphicon-chevron-down',\n arrowBehavior: 'pager'\n };\n\n this.$get = function($window, $document, $rootScope, $sce, $dateFormatter, $tooltip, $timeout) {\n\n var bodyEl = angular.element($window.document.body);\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var isTouch = ('createTouch' in $window.document) && isNative;\n if(!defaults.lang) defaults.lang = $dateFormatter.getDefaultLocale();\n\n function timepickerFactory(element, controller, config) {\n\n var $timepicker = $tooltip(element, angular.extend({}, defaults, config));\n var parentScope = config.scope;\n var options = $timepicker.$options;\n var scope = $timepicker.$scope;\n\n var lang = options.lang;\n var formatDate = function(date, format) {\n return $dateFormatter.formatDate(date, format, lang);\n };\n\n // View vars\n\n var selectedIndex = 0;\n var startDate = controller.$dateValue || new Date();\n var viewDate = {hour: startDate.getHours(), meridian: startDate.getHours() < 12, minute: startDate.getMinutes(), second: startDate.getSeconds(), millisecond: startDate.getMilliseconds()};\n\n var format = $dateFormatter.getDatetimeFormat(options.timeFormat, lang);\n\n var hoursFormat = $dateFormatter.hoursFormat(format),\n timeSeparator = $dateFormatter.timeSeparator(format),\n minutesFormat = $dateFormatter.minutesFormat(format),\n showAM = $dateFormatter.showAM(format);\n\n scope.$iconUp = options.iconUp;\n scope.$iconDown = options.iconDown;\n\n // Scope methods\n\n scope.$select = function(date, index) {\n $timepicker.select(date, index);\n };\n scope.$moveIndex = function(value, index) {\n $timepicker.$moveIndex(value, index);\n };\n scope.$switchMeridian = function(date) {\n $timepicker.switchMeridian(date);\n };\n\n // Public methods\n\n $timepicker.update = function(date) {\n // console.warn('$timepicker.update() newValue=%o', date);\n if(angular.isDate(date) && !isNaN(date.getTime())) {\n $timepicker.$date = date;\n angular.extend(viewDate, {hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds(), millisecond: date.getMilliseconds()});\n $timepicker.$build();\n } else if(!$timepicker.$isBuilt) {\n $timepicker.$build();\n }\n };\n\n $timepicker.select = function(date, index, keep) {\n // console.warn('$timepicker.select', date, scope.$mode);\n if(!controller.$dateValue || isNaN(controller.$dateValue.getTime())) controller.$dateValue = new Date(1970, 0, 1);\n if(!angular.isDate(date)) date = new Date(date);\n if(index === 0) controller.$dateValue.setHours(date.getHours());\n else if(index === 1) controller.$dateValue.setMinutes(date.getMinutes());\n controller.$setViewValue(angular.copy(controller.$dateValue));\n controller.$render();\n if(options.autoclose && !keep) {\n $timeout(function() { $timepicker.hide(true); });\n }\n };\n\n $timepicker.switchMeridian = function(date) {\n if (!controller.$dateValue || isNaN(controller.$dateValue.getTime())) {\n return;\n }\n var hours = (date || controller.$dateValue).getHours();\n controller.$dateValue.setHours(hours < 12 ? hours + 12 : hours - 12);\n controller.$setViewValue(angular.copy(controller.$dateValue));\n controller.$render();\n };\n\n // Protected methods\n\n $timepicker.$build = function() {\n // console.warn('$timepicker.$build() viewDate=%o', viewDate);\n var i, midIndex = scope.midIndex = parseInt(options.length / 2, 10);\n var hours = [], hour;\n for(i = 0; i < options.length; i++) {\n hour = new Date(1970, 0, 1, viewDate.hour - (midIndex - i) * options.hourStep);\n hours.push({date: hour, label: formatDate(hour, hoursFormat), selected: $timepicker.$date && $timepicker.$isSelected(hour, 0), disabled: $timepicker.$isDisabled(hour, 0)});\n }\n var minutes = [], minute;\n for(i = 0; i < options.length; i++) {\n minute = new Date(1970, 0, 1, 0, viewDate.minute - (midIndex - i) * options.minuteStep);\n minutes.push({date: minute, label: formatDate(minute, minutesFormat), selected: $timepicker.$date && $timepicker.$isSelected(minute, 1), disabled: $timepicker.$isDisabled(minute, 1)});\n }\n\n var rows = [];\n for(i = 0; i < options.length; i++) {\n rows.push([hours[i], minutes[i]]);\n }\n scope.rows = rows;\n scope.showAM = showAM;\n scope.isAM = ($timepicker.$date || hours[midIndex].date).getHours() < 12;\n scope.timeSeparator = timeSeparator;\n $timepicker.$isBuilt = true;\n };\n\n $timepicker.$isSelected = function(date, index) {\n if(!$timepicker.$date) return false;\n else if(index === 0) {\n return date.getHours() === $timepicker.$date.getHours();\n } else if(index === 1) {\n return date.getMinutes() === $timepicker.$date.getMinutes();\n }\n };\n\n $timepicker.$isDisabled = function(date, index) {\n var selectedTime;\n if(index === 0) {\n selectedTime = date.getTime() + viewDate.minute * 6e4;\n } else if(index === 1) {\n selectedTime = date.getTime() + viewDate.hour * 36e5;\n }\n return selectedTime < options.minTime * 1 || selectedTime > options.maxTime * 1;\n };\n\n scope.$arrowAction = function (value, index) {\n if (options.arrowBehavior === 'picker') {\n $timepicker.$setTimeByStep(value,index);\n } else {\n $timepicker.$moveIndex(value,index);\n }\n };\n\n $timepicker.$setTimeByStep = function(value, index) {\n var newDate = new Date($timepicker.$date);\n var hours = newDate.getHours(), hoursLength = formatDate(newDate, hoursFormat).length;\n var minutes = newDate.getMinutes(), minutesLength = formatDate(newDate, minutesFormat).length;\n if (index === 0) {\n newDate.setHours(hours - (parseInt(options.hourStep, 10) * value));\n }\n else {\n newDate.setMinutes(minutes - (parseInt(options.minuteStep, 10) * value));\n }\n $timepicker.select(newDate, index, true);\n };\n\n $timepicker.$moveIndex = function(value, index) {\n var targetDate;\n if(index === 0) {\n targetDate = new Date(1970, 0, 1, viewDate.hour + (value * options.length), viewDate.minute);\n angular.extend(viewDate, {hour: targetDate.getHours()});\n } else if(index === 1) {\n targetDate = new Date(1970, 0, 1, viewDate.hour, viewDate.minute + (value * options.length * options.minuteStep));\n angular.extend(viewDate, {minute: targetDate.getMinutes()});\n }\n $timepicker.$build();\n };\n\n $timepicker.$onMouseDown = function(evt) {\n // Prevent blur on mousedown on .dropdown-menu\n if(evt.target.nodeName.toLowerCase() !== 'input') evt.preventDefault();\n evt.stopPropagation();\n // Emulate click for mobile devices\n if(isTouch) {\n var targetEl = angular.element(evt.target);\n if(targetEl[0].nodeName.toLowerCase() !== 'button') {\n targetEl = targetEl.parent();\n }\n targetEl.triggerHandler('click');\n }\n };\n\n $timepicker.$onKeyDown = function(evt) {\n if (!/(38|37|39|40|13)/.test(evt.keyCode) || evt.shiftKey || evt.altKey) return;\n evt.preventDefault();\n evt.stopPropagation();\n\n // Close on enter\n if(evt.keyCode === 13) return $timepicker.hide(true);\n\n // Navigate with keyboard\n var newDate = new Date($timepicker.$date);\n var hours = newDate.getHours(), hoursLength = formatDate(newDate, hoursFormat).length;\n var minutes = newDate.getMinutes(), minutesLength = formatDate(newDate, minutesFormat).length;\n var lateralMove = /(37|39)/.test(evt.keyCode);\n var count = 2 + showAM * 1;\n\n // Navigate indexes (left, right)\n if (lateralMove) {\n if(evt.keyCode === 37) selectedIndex = selectedIndex < 1 ? count - 1 : selectedIndex - 1;\n else if(evt.keyCode === 39) selectedIndex = selectedIndex < count - 1 ? selectedIndex + 1 : 0;\n }\n\n // Update values (up, down)\n var selectRange = [0, hoursLength];\n if(selectedIndex === 0) {\n if(evt.keyCode === 38) newDate.setHours(hours - parseInt(options.hourStep, 10));\n else if(evt.keyCode === 40) newDate.setHours(hours + parseInt(options.hourStep, 10));\n // re-calculate hours length because we have changed hours value\n hoursLength = formatDate(newDate, hoursFormat).length;\n selectRange = [0, hoursLength];\n } else if(selectedIndex === 1) {\n if(evt.keyCode === 38) newDate.setMinutes(minutes - parseInt(options.minuteStep, 10));\n else if(evt.keyCode === 40) newDate.setMinutes(minutes + parseInt(options.minuteStep, 10));\n // re-calculate minutes length because we have changes minutes value\n minutesLength = formatDate(newDate, minutesFormat).length;\n selectRange = [hoursLength + 1, hoursLength + 1 + minutesLength];\n } else if(selectedIndex === 2) {\n if(!lateralMove) $timepicker.switchMeridian();\n selectRange = [hoursLength + 1 + minutesLength + 1, hoursLength + 1 + minutesLength + 3];\n }\n $timepicker.select(newDate, selectedIndex, true);\n createSelection(selectRange[0], selectRange[1]);\n parentScope.$digest();\n };\n\n // Private\n\n function createSelection(start, end) {\n if(element[0].createTextRange) {\n var selRange = element[0].createTextRange();\n selRange.collapse(true);\n selRange.moveStart('character', start);\n selRange.moveEnd('character', end);\n selRange.select();\n } else if(element[0].setSelectionRange) {\n element[0].setSelectionRange(start, end);\n } else if(angular.isUndefined(element[0].selectionStart)) {\n element[0].selectionStart = start;\n element[0].selectionEnd = end;\n }\n }\n\n function focusElement() {\n element[0].focus();\n }\n\n // Overrides\n\n var _init = $timepicker.init;\n $timepicker.init = function() {\n if(isNative && options.useNative) {\n element.prop('type', 'time');\n element.css('-webkit-appearance', 'textfield');\n return;\n } else if(isTouch) {\n element.prop('type', 'text');\n element.attr('readonly', 'true');\n element.on('click', focusElement);\n }\n _init();\n };\n\n var _destroy = $timepicker.destroy;\n $timepicker.destroy = function() {\n if(isNative && options.useNative) {\n element.off('click', focusElement);\n }\n _destroy();\n };\n\n var _show = $timepicker.show;\n $timepicker.show = function() {\n _show();\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n $timepicker.$element.on(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $timepicker.$onKeyDown);\n }\n }, 0, false);\n };\n\n var _hide = $timepicker.hide;\n $timepicker.hide = function(blur) {\n if(!$timepicker.$isShown) return;\n $timepicker.$element.off(isTouch ? 'touchstart' : 'mousedown', $timepicker.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $timepicker.$onKeyDown);\n }\n _hide(blur);\n };\n\n return $timepicker;\n\n }\n\n timepickerFactory.defaults = defaults;\n return timepickerFactory;\n\n };\n\n })\n\n\n .directive('bsTimepicker', function($window, $parse, $q, $dateFormatter, $dateParser, $timepicker) {\n\n var defaults = $timepicker.defaults;\n var isNative = /(ip(a|o)d|iphone|android)/ig.test($window.navigator.userAgent);\n var requestAnimationFrame = $window.requestAnimationFrame || $window.setTimeout;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope, controller: controller};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'autoclose', 'timeType', 'timeFormat', 'modelTimeFormat', 'useNative', 'hourStep', 'minuteStep', 'length', 'arrowBehavior', 'iconUp', 'iconDown', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!timepicker || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(timepicker),?/i);\n newValue === true ? timepicker.show() : timepicker.hide();\n });\n\n // Initialize timepicker\n if(isNative && (options.useNative || defaults.useNative)) options.timeFormat = 'HH:mm';\n var timepicker = $timepicker(element, controller, options);\n options = timepicker.$options;\n\n var lang = options.lang;\n var formatDate = function(date, format) {\n return $dateFormatter.formatDate(date, format, lang);\n };\n\n // Initialize parser\n var dateParser = $dateParser({format: options.timeFormat, lang: lang});\n\n // Observe attributes for changes\n angular.forEach(['minTime', 'maxTime'], function(key) {\n // console.warn('attr.$observe(%s)', key, attr[key]);\n angular.isDefined(attr[key]) && attr.$observe(key, function(newValue) {\n timepicker.$options[key] = dateParser.getTimeForAttribute(key, newValue);\n !isNaN(timepicker.$options[key]) && timepicker.$build();\n validateAgainstMinMaxTime(controller.$dateValue);\n });\n });\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.ngModel, newValue, oldValue, controller.$dateValue);\n timepicker.update(controller.$dateValue);\n }, true);\n\n function validateAgainstMinMaxTime(parsedTime) {\n if (!angular.isDate(parsedTime)) return;\n var isMinValid = isNaN(options.minTime) || new Date(parsedTime.getTime()).setFullYear(1970, 0, 1) >= options.minTime;\n var isMaxValid = isNaN(options.maxTime) || new Date(parsedTime.getTime()).setFullYear(1970, 0, 1) <= options.maxTime;\n var isValid = isMinValid && isMaxValid;\n controller.$setValidity('date', isValid);\n controller.$setValidity('min', isMinValid);\n controller.$setValidity('max', isMaxValid);\n // Only update the model when we have a valid date\n if(!isValid) {\n return;\n }\n controller.$dateValue = parsedTime;\n }\n\n // viewValue -> $parsers -> modelValue\n controller.$parsers.unshift(function(viewValue) {\n // console.warn('$parser(\"%s\"): viewValue=%o', element.attr('ng-model'), viewValue);\n // Null values should correctly reset the model value & validity\n if(!viewValue) {\n // BREAKING CHANGE:\n // return null (not undefined) when input value is empty, so angularjs 1.3\n // ngModelController can go ahead and run validators, like ngRequired\n controller.$setValidity('date', true);\n return null;\n }\n var parsedTime = angular.isDate(viewValue) ? viewValue : dateParser.parse(viewValue, controller.$dateValue);\n if(!parsedTime || isNaN(parsedTime.getTime())) {\n controller.$setValidity('date', false);\n // return undefined, causes ngModelController to\n // invalidate model value\n return;\n } else {\n validateAgainstMinMaxTime(parsedTime);\n }\n if(options.timeType === 'string') {\n return formatDate(parsedTime, options.modelTimeFormat || options.timeFormat);\n } else if(options.timeType === 'number') {\n return controller.$dateValue.getTime();\n } else if(options.timeType === 'unix') {\n return controller.$dateValue.getTime() / 1000;\n } else if(options.timeType === 'iso') {\n return controller.$dateValue.toISOString();\n } else {\n return new Date(controller.$dateValue);\n }\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var date;\n if(angular.isUndefined(modelValue) || modelValue === null) {\n date = NaN;\n } else if(angular.isDate(modelValue)) {\n date = modelValue;\n } else if(options.timeType === 'string') {\n date = dateParser.parse(modelValue, null, options.modelTimeFormat);\n } else if(options.timeType === 'unix') {\n date = new Date(modelValue * 1000);\n } else {\n date = new Date(modelValue);\n }\n // Setup default value?\n // if(isNaN(date.getTime())) date = new Date(new Date().setMinutes(0) + 36e5);\n controller.$dateValue = date;\n return getTimeFormattedString();\n });\n\n // viewValue -> element\n controller.$render = function() {\n // console.warn('$render(\"%s\"): viewValue=%o', element.attr('ng-model'), controller.$viewValue);\n element.val(getTimeFormattedString());\n };\n\n function getTimeFormattedString() {\n return !controller.$dateValue || isNaN(controller.$dateValue.getTime()) ? '' : formatDate(controller.$dateValue, options.timeFormat);\n }\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (timepicker) timepicker.destroy();\n options = null;\n timepicker = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.tooltip', ['mgcrea.ngStrap.helpers.dimensions'])\n\n .provider('$tooltip', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n customClass: '',\n prefixClass: 'tooltip',\n prefixEvent: 'tooltip',\n container: false,\n target: false,\n placement: 'top',\n template: 'tooltip/tooltip.tpl.html',\n contentTemplate: false,\n trigger: 'hover focus',\n keyboard: false,\n html: false,\n show: false,\n title: '',\n type: '',\n delay: 0,\n autoClose: false,\n bsEnabled: true\n };\n\n this.$get = function($window, $rootScope, $compile, $q, $templateCache, $http, $animate, $sce, dimensions, $$rAF, $timeout) {\n\n var trim = String.prototype.trim;\n var isTouch = 'createTouch' in $window.document;\n var htmlReplaceRegExp = /ng-bind=\"/ig;\n var $body = angular.element($window.document);\n\n function TooltipFactory(element, config) {\n\n var $tooltip = {};\n\n // Common vars\n var nodeName = element[0].nodeName.toLowerCase();\n var options = $tooltip.$options = angular.extend({}, defaults, config);\n $tooltip.$promise = fetchTemplate(options.template);\n var scope = $tooltip.$scope = options.scope && options.scope.$new() || $rootScope.$new();\n if(options.delay && angular.isString(options.delay)) {\n var split = options.delay.split(',').map(parseFloat);\n options.delay = split.length > 1 ? {show: split[0], hide: split[1]} : split[0];\n }\n\n // store $id to identify the triggering element in events\n // give priority to options.id, otherwise, try to use\n // element id if defined\n $tooltip.$id = options.id || element.attr('id') || '';\n\n // Support scope as string options\n if(options.title) {\n scope.title = $sce.trustAsHtml(options.title);\n }\n\n // Provide scope helpers\n scope.$setEnabled = function(isEnabled) {\n scope.$$postDigest(function() {\n $tooltip.setEnabled(isEnabled);\n });\n };\n scope.$hide = function() {\n scope.$$postDigest(function() {\n $tooltip.hide();\n });\n };\n scope.$show = function() {\n scope.$$postDigest(function() {\n $tooltip.show();\n });\n };\n scope.$toggle = function() {\n scope.$$postDigest(function() {\n $tooltip.toggle();\n });\n };\n // Publish isShown as a protected var on scope\n $tooltip.$isShown = scope.$isShown = false;\n\n // Private vars\n var timeout, hoverState;\n\n // Support contentTemplate option\n if(options.contentTemplate) {\n $tooltip.$promise = $tooltip.$promise.then(function(template) {\n var templateEl = angular.element(template);\n return fetchTemplate(options.contentTemplate)\n .then(function(contentTemplate) {\n var contentEl = findElement('[ng-bind=\"content\"]', templateEl[0]);\n if(!contentEl.length) contentEl = findElement('[ng-bind=\"title\"]', templateEl[0]);\n contentEl.removeAttr('ng-bind').html(contentTemplate);\n return templateEl[0].outerHTML;\n });\n });\n }\n\n // Fetch, compile then initialize tooltip\n var tipLinker, tipElement, tipTemplate, tipContainer, tipScope;\n $tooltip.$promise.then(function(template) {\n if(angular.isObject(template)) template = template.data;\n if(options.html) template = template.replace(htmlReplaceRegExp, 'ng-bind-html=\"');\n template = trim.apply(template);\n tipTemplate = template;\n tipLinker = $compile(template);\n $tooltip.init();\n });\n\n $tooltip.init = function() {\n\n // Options: delay\n if (options.delay && angular.isNumber(options.delay)) {\n options.delay = {\n show: options.delay,\n hide: options.delay\n };\n }\n\n // Replace trigger on touch devices ?\n // if(isTouch && options.trigger === defaults.trigger) {\n // options.trigger.replace(/hover/g, 'click');\n // }\n\n // Options : container\n if(options.container === 'self') {\n tipContainer = element;\n } else if(angular.isElement(options.container)) {\n tipContainer = options.container;\n } else if(options.container) {\n tipContainer = findElement(options.container);\n }\n\n // Options: trigger\n bindTriggerEvents();\n\n // Options: target\n if(options.target) {\n options.target = angular.isElement(options.target) ? options.target : findElement(options.target);\n }\n\n // Options: show\n if(options.show) {\n scope.$$postDigest(function() {\n options.trigger === 'focus' ? element[0].focus() : $tooltip.show();\n });\n }\n\n };\n\n $tooltip.destroy = function() {\n\n // Unbind events\n unbindTriggerEvents();\n\n // Remove element\n destroyTipElement();\n\n // Destroy scope\n scope.$destroy();\n\n };\n\n $tooltip.enter = function() {\n\n clearTimeout(timeout);\n hoverState = 'in';\n if (!options.delay || !options.delay.show) {\n return $tooltip.show();\n }\n\n timeout = setTimeout(function() {\n if (hoverState ==='in') $tooltip.show();\n }, options.delay.show);\n\n };\n\n $tooltip.show = function() {\n if (!options.bsEnabled || $tooltip.$isShown) return;\n\n scope.$emit(options.prefixEvent + '.show.before', $tooltip);\n var parent, after;\n if (options.container) {\n parent = tipContainer;\n if (tipContainer[0].lastChild) {\n after = angular.element(tipContainer[0].lastChild);\n } else {\n after = null;\n }\n } else {\n parent = null;\n after = element;\n }\n\n\n // Hide any existing tipElement\n if(tipElement) destroyTipElement();\n // Fetch a cloned element linked from template\n tipScope = $tooltip.$scope.$new();\n tipElement = $tooltip.$element = tipLinker(tipScope, function(clonedElement, scope) {});\n\n // Set the initial positioning. Make the tooltip invisible\n // so IE doesn't try to focus on it off screen.\n tipElement.css({top: '-9999px', left: '-9999px', display: 'block', visibility: 'hidden'});\n\n // Options: animation\n if(options.animation) tipElement.addClass(options.animation);\n // Options: type\n if(options.type) tipElement.addClass(options.prefixClass + '-' + options.type);\n // Options: custom classes\n if(options.customClass) tipElement.addClass(options.customClass);\n\n // Support v1.3+ $animate\n // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9\n var promise = $animate.enter(tipElement, parent, after, enterAnimateCallback);\n if(promise && promise.then) promise.then(enterAnimateCallback);\n\n $tooltip.$isShown = scope.$isShown = true;\n safeDigest(scope);\n $$rAF(function () {\n $tooltip.$applyPlacement();\n\n // Once placed, make the tooltip visible\n if(tipElement) tipElement.css({visibility: 'visible'});\n }); // var a = bodyEl.offsetWidth + 1; ?\n\n // Bind events\n if(options.keyboard) {\n if(options.trigger !== 'focus') {\n $tooltip.focus();\n }\n bindKeyboardEvents();\n }\n\n if(options.autoClose) {\n bindAutoCloseEvents();\n }\n\n };\n\n function enterAnimateCallback() {\n scope.$emit(options.prefixEvent + '.show', $tooltip);\n }\n\n $tooltip.leave = function() {\n\n clearTimeout(timeout);\n hoverState = 'out';\n if (!options.delay || !options.delay.hide) {\n return $tooltip.hide();\n }\n timeout = setTimeout(function () {\n if (hoverState === 'out') {\n $tooltip.hide();\n }\n }, options.delay.hide);\n\n };\n\n var _blur;\n var _tipToHide;\n $tooltip.hide = function(blur) {\n\n if(!$tooltip.$isShown) return;\n scope.$emit(options.prefixEvent + '.hide.before', $tooltip);\n\n // store blur value for leaveAnimateCallback to use\n _blur = blur;\n\n // store current tipElement reference to use\n // in leaveAnimateCallback\n _tipToHide = tipElement;\n\n // Support v1.3+ $animate\n // https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9\n var promise = $animate.leave(tipElement, leaveAnimateCallback);\n if(promise && promise.then) promise.then(leaveAnimateCallback);\n\n $tooltip.$isShown = scope.$isShown = false;\n safeDigest(scope);\n\n // Unbind events\n if(options.keyboard && tipElement !== null) {\n unbindKeyboardEvents();\n }\n\n if(options.autoClose && tipElement !== null) {\n unbindAutoCloseEvents();\n }\n };\n\n function leaveAnimateCallback() {\n scope.$emit(options.prefixEvent + '.hide', $tooltip);\n\n // check if current tipElement still references\n // the same element when hide was called\n if (tipElement === _tipToHide) {\n // Allow to blur the input when hidden, like when pressing enter key\n if(_blur && options.trigger === 'focus') {\n return element[0].blur();\n }\n\n // clean up child scopes\n destroyTipElement();\n }\n }\n\n $tooltip.toggle = function() {\n $tooltip.$isShown ? $tooltip.leave() : $tooltip.enter();\n };\n\n $tooltip.focus = function() {\n tipElement[0].focus();\n };\n\n $tooltip.setEnabled = function(isEnabled) {\n options.bsEnabled = isEnabled;\n };\n\n // Protected methods\n\n $tooltip.$applyPlacement = function() {\n if(!tipElement) return;\n\n // Determine if we're doing an auto or normal placement\n var placement = options.placement,\n autoToken = /\\s?auto?\\s?/i,\n autoPlace = autoToken.test(placement);\n\n if (autoPlace) {\n placement = placement.replace(autoToken, '') || defaults.placement;\n }\n\n // Need to add the position class before we get\n // the offsets\n tipElement.addClass(options.placement);\n\n // Get the position of the target element\n // and the height and width of the tooltip so we can center it.\n var elementPosition = getPosition(),\n tipWidth = tipElement.prop('offsetWidth'),\n tipHeight = tipElement.prop('offsetHeight');\n\n // If we're auto placing, we need to check the positioning\n if (autoPlace) {\n var originalPlacement = placement;\n var container = options.container ? angular.element(document.querySelector(options.container)) : element.parent();\n var containerPosition = getPosition(container);\n\n // Determine if the vertical placement\n if (originalPlacement.indexOf('bottom') >= 0 && elementPosition.bottom + tipHeight > containerPosition.bottom) {\n placement = originalPlacement.replace('bottom', 'top');\n } else if (originalPlacement.indexOf('top') >= 0 && elementPosition.top - tipHeight < containerPosition.top) {\n placement = originalPlacement.replace('top', 'bottom');\n }\n\n // Determine the horizontal placement\n // The exotic placements of left and right are opposite of the standard placements. Their arrows are put on the left/right\n // and flow in the opposite direction of their placement.\n if ((originalPlacement === 'right' || originalPlacement === 'bottom-left' || originalPlacement === 'top-left') &&\n elementPosition.right + tipWidth > containerPosition.width) {\n\n placement = originalPlacement === 'right' ? 'left' : placement.replace('left', 'right');\n } else if ((originalPlacement === 'left' || originalPlacement === 'bottom-right' || originalPlacement === 'top-right') &&\n elementPosition.left - tipWidth < containerPosition.left) {\n\n placement = originalPlacement === 'left' ? 'right' : placement.replace('right', 'left');\n }\n\n tipElement.removeClass(originalPlacement).addClass(placement);\n }\n\n // Get the tooltip's top and left coordinates to center it with this directive.\n var tipPosition = getCalculatedOffset(placement, elementPosition, tipWidth, tipHeight);\n applyPlacementCss(tipPosition.top, tipPosition.left);\n };\n\n $tooltip.$onKeyUp = function(evt) {\n if (evt.which === 27 && $tooltip.$isShown) {\n $tooltip.hide();\n evt.stopPropagation();\n }\n };\n\n $tooltip.$onFocusKeyUp = function(evt) {\n if (evt.which === 27) {\n element[0].blur();\n evt.stopPropagation();\n }\n };\n\n $tooltip.$onFocusElementMouseDown = function(evt) {\n evt.preventDefault();\n evt.stopPropagation();\n // Some browsers do not auto-focus buttons (eg. Safari)\n $tooltip.$isShown ? element[0].blur() : element[0].focus();\n };\n\n // bind/unbind events\n function bindTriggerEvents() {\n var triggers = options.trigger.split(' ');\n angular.forEach(triggers, function(trigger) {\n if(trigger === 'click') {\n element.on('click', $tooltip.toggle);\n } else if(trigger !== 'manual') {\n element.on(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n element.on(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n nodeName === 'button' && trigger !== 'hover' && element.on(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n }\n });\n }\n\n function unbindTriggerEvents() {\n var triggers = options.trigger.split(' ');\n for (var i = triggers.length; i--;) {\n var trigger = triggers[i];\n if(trigger === 'click') {\n element.off('click', $tooltip.toggle);\n } else if(trigger !== 'manual') {\n element.off(trigger === 'hover' ? 'mouseenter' : 'focus', $tooltip.enter);\n element.off(trigger === 'hover' ? 'mouseleave' : 'blur', $tooltip.leave);\n nodeName === 'button' && trigger !== 'hover' && element.off(isTouch ? 'touchstart' : 'mousedown', $tooltip.$onFocusElementMouseDown);\n }\n }\n }\n\n function bindKeyboardEvents() {\n if(options.trigger !== 'focus') {\n tipElement.on('keyup', $tooltip.$onKeyUp);\n } else {\n element.on('keyup', $tooltip.$onFocusKeyUp);\n }\n }\n\n function unbindKeyboardEvents() {\n if(options.trigger !== 'focus') {\n tipElement.off('keyup', $tooltip.$onKeyUp);\n } else {\n element.off('keyup', $tooltip.$onFocusKeyUp);\n }\n }\n\n var _autoCloseEventsBinded = false;\n function bindAutoCloseEvents() {\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n // Stop propagation when clicking inside tooltip\n tipElement.on('click', stopEventPropagation);\n\n // Hide when clicking outside tooltip\n $body.on('click', $tooltip.hide);\n\n _autoCloseEventsBinded = true;\n }, 0, false);\n }\n\n function unbindAutoCloseEvents() {\n if (_autoCloseEventsBinded) {\n tipElement.off('click', stopEventPropagation);\n $body.off('click', $tooltip.hide);\n _autoCloseEventsBinded = false;\n }\n }\n\n function stopEventPropagation(event) {\n event.stopPropagation();\n }\n\n // Private methods\n\n function getPosition($element) {\n $element = $element || (options.target || element);\n\n var el = $element[0];\n\n var elRect = el.getBoundingClientRect();\n if (elRect.width === null) {\n // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n elRect = angular.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top });\n }\n\n var elPos;\n if (options.container === 'body') {\n elPos = dimensions.offset(el);\n } else {\n elPos = dimensions.position(el);\n }\n\n return angular.extend({}, elRect, elPos);\n }\n\n function getCalculatedOffset(placement, position, actualWidth, actualHeight) {\n var offset;\n var split = placement.split('-');\n\n switch (split[0]) {\n case 'right':\n offset = {\n top: position.top + position.height / 2 - actualHeight / 2,\n left: position.left + position.width\n };\n break;\n case 'bottom':\n offset = {\n top: position.top + position.height,\n left: position.left + position.width / 2 - actualWidth / 2\n };\n break;\n case 'left':\n offset = {\n top: position.top + position.height / 2 - actualHeight / 2,\n left: position.left - actualWidth\n };\n break;\n default:\n offset = {\n top: position.top - actualHeight,\n left: position.left + position.width / 2 - actualWidth / 2\n };\n break;\n }\n\n if(!split[1]) {\n return offset;\n }\n\n // Add support for corners @todo css\n if(split[0] === 'top' || split[0] === 'bottom') {\n switch (split[1]) {\n case 'left':\n offset.left = position.left;\n break;\n case 'right':\n offset.left = position.left + position.width - actualWidth;\n }\n } else if(split[0] === 'left' || split[0] === 'right') {\n switch (split[1]) {\n case 'top':\n offset.top = position.top - actualHeight;\n break;\n case 'bottom':\n offset.top = position.top + position.height;\n }\n }\n\n return offset;\n }\n\n function applyPlacementCss(top, left) {\n tipElement.css({ top: top + 'px', left: left + 'px' });\n }\n\n function destroyTipElement() {\n // Cancel pending callbacks\n clearTimeout(timeout);\n\n if($tooltip.$isShown && tipElement !== null) {\n if(options.autoClose) {\n unbindAutoCloseEvents();\n }\n\n if(options.keyboard) {\n unbindKeyboardEvents();\n }\n }\n\n if(tipScope) {\n tipScope.$destroy();\n tipScope = null;\n }\n\n if(tipElement) {\n tipElement.remove();\n tipElement = $tooltip.$element = null;\n }\n }\n\n return $tooltip;\n\n }\n\n // Helper functions\n\n function safeDigest(scope) {\n scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();\n }\n\n function findElement(query, element) {\n return angular.element((element || document).querySelectorAll(query));\n }\n\n var fetchPromises = {};\n function fetchTemplate(template) {\n if(fetchPromises[template]) return fetchPromises[template];\n return (fetchPromises[template] = $q.when($templateCache.get(template) || $http.get(template))\n .then(function(res) {\n if(angular.isObject(res)) {\n $templateCache.put(template, res.data);\n return res.data;\n }\n return res;\n }));\n }\n\n return TooltipFactory;\n\n };\n\n })\n\n .directive('bsTooltip', function($window, $location, $sce, $tooltip, $$rAF) {\n\n return {\n restrict: 'EAC',\n scope: true,\n link: function postLink(scope, element, attr, transclusion) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['template', 'contentTemplate', 'placement', 'container', 'target', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'backdropAnimation', 'type', 'customClass', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // overwrite inherited title value when no value specified\n // fix for angular 1.3.1 531a8de72c439d8ddd064874bf364c00cedabb11\n if (!scope.hasOwnProperty('title')){\n scope.title = '';\n }\n\n // Observe scope attributes for change\n attr.$observe('title', function(newValue) {\n if (angular.isDefined(newValue) || !scope.hasOwnProperty('title')) {\n var oldValue = scope.title;\n scope.title = $sce.trustAsHtml(newValue);\n angular.isDefined(oldValue) && $$rAF(function() {\n tooltip && tooltip.$applyPlacement();\n });\n }\n });\n\n // Support scope as an object\n attr.bsTooltip && scope.$watch(attr.bsTooltip, function(newValue, oldValue) {\n if(angular.isObject(newValue)) {\n angular.extend(scope, newValue);\n } else {\n scope.title = newValue;\n }\n angular.isDefined(oldValue) && $$rAF(function() {\n tooltip && tooltip.$applyPlacement();\n });\n }, true);\n\n // Visibility binding support\n attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {\n if(!tooltip || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(tooltip),?/i);\n newValue === true ? tooltip.show() : tooltip.hide();\n });\n\n // Enabled binding support\n attr.bsEnabled && scope.$watch(attr.bsEnabled, function(newValue, oldValue) {\n // console.warn('scope.$watch(%s)', attr.bsEnabled, newValue, oldValue);\n if(!tooltip || !angular.isDefined(newValue)) return;\n if(angular.isString(newValue)) newValue = !!newValue.match(/true|1|,?(tooltip),?/i);\n newValue === false ? tooltip.setEnabled(false) : tooltip.setEnabled(true);\n });\n\n // Initialize popover\n var tooltip = $tooltip(element, options);\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if(tooltip) tooltip.destroy();\n options = null;\n tooltip = null;\n });\n\n }\n };\n\n });\n","'use strict';\n\nangular.module('mgcrea.ngStrap.typeahead', ['mgcrea.ngStrap.tooltip', 'mgcrea.ngStrap.helpers.parseOptions'])\n\n .provider('$typeahead', function() {\n\n var defaults = this.defaults = {\n animation: 'am-fade',\n prefixClass: 'typeahead',\n prefixEvent: '$typeahead',\n placement: 'bottom-left',\n template: 'typeahead/typeahead.tpl.html',\n trigger: 'focus',\n container: false,\n keyboard: true,\n html: false,\n delay: 0,\n minLength: 1,\n filter: 'filter',\n limit: 6,\n comparator: ''\n };\n\n this.$get = function($window, $rootScope, $tooltip, $timeout) {\n\n var bodyEl = angular.element($window.document.body);\n\n function TypeaheadFactory(element, controller, config) {\n\n var $typeahead = {};\n\n // Common vars\n var options = angular.extend({}, defaults, config);\n\n $typeahead = $tooltip(element, options);\n var parentScope = config.scope;\n var scope = $typeahead.$scope;\n\n scope.$resetMatches = function(){\n scope.$matches = [];\n scope.$activeIndex = 0;\n };\n scope.$resetMatches();\n\n scope.$activate = function(index) {\n scope.$$postDigest(function() {\n $typeahead.activate(index);\n });\n };\n\n scope.$select = function(index, evt) {\n scope.$$postDigest(function() {\n $typeahead.select(index);\n });\n };\n\n scope.$isVisible = function() {\n return $typeahead.$isVisible();\n };\n\n // Public methods\n\n $typeahead.update = function(matches) {\n scope.$matches = matches;\n if(scope.$activeIndex >= matches.length) {\n scope.$activeIndex = 0;\n }\n };\n\n $typeahead.activate = function(index) {\n scope.$activeIndex = index;\n };\n\n $typeahead.select = function(index) {\n var value = scope.$matches[index].value;\n // console.log('$setViewValue', value);\n controller.$setViewValue(value);\n controller.$render();\n scope.$resetMatches();\n if(parentScope) parentScope.$digest();\n // Emit event\n scope.$emit(options.prefixEvent + '.select', value, index, $typeahead);\n };\n\n // Protected methods\n\n $typeahead.$isVisible = function() {\n if(!options.minLength || !controller) {\n return !!scope.$matches.length;\n }\n // minLength support\n return scope.$matches.length && angular.isString(controller.$viewValue) && controller.$viewValue.length >= options.minLength;\n };\n\n $typeahead.$getIndex = function(value) {\n var l = scope.$matches.length, i = l;\n if(!l) return;\n for(i = l; i--;) {\n if(scope.$matches[i].value === value) break;\n }\n if(i < 0) return;\n return i;\n };\n\n $typeahead.$onMouseDown = function(evt) {\n // Prevent blur on mousedown\n evt.preventDefault();\n evt.stopPropagation();\n };\n\n $typeahead.$onKeyDown = function(evt) {\n if(!/(38|40|13)/.test(evt.keyCode)) return;\n\n // Let ngSubmit pass if the typeahead tip is hidden\n if($typeahead.$isVisible()) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n // Select with enter\n if(evt.keyCode === 13 && scope.$matches.length) {\n $typeahead.select(scope.$activeIndex);\n }\n\n // Navigate with keyboard\n else if(evt.keyCode === 38 && scope.$activeIndex > 0) scope.$activeIndex--;\n else if(evt.keyCode === 40 && scope.$activeIndex < scope.$matches.length - 1) scope.$activeIndex++;\n else if(angular.isUndefined(scope.$activeIndex)) scope.$activeIndex = 0;\n scope.$digest();\n };\n\n // Overrides\n\n var show = $typeahead.show;\n $typeahead.show = function() {\n show();\n // use timeout to hookup the events to prevent\n // event bubbling from being processed imediately.\n $timeout(function() {\n $typeahead.$element.on('mousedown', $typeahead.$onMouseDown);\n if(options.keyboard) {\n element.on('keydown', $typeahead.$onKeyDown);\n }\n }, 0, false);\n };\n\n var hide = $typeahead.hide;\n $typeahead.hide = function() {\n $typeahead.$element.off('mousedown', $typeahead.$onMouseDown);\n if(options.keyboard) {\n element.off('keydown', $typeahead.$onKeyDown);\n }\n hide();\n };\n\n return $typeahead;\n\n }\n\n TypeaheadFactory.defaults = defaults;\n return TypeaheadFactory;\n\n };\n\n })\n\n .directive('bsTypeahead', function($window, $parse, $q, $typeahead, $parseOptions) {\n\n var defaults = $typeahead.defaults;\n\n return {\n restrict: 'EAC',\n require: 'ngModel',\n link: function postLink(scope, element, attr, controller) {\n\n // Directive options\n var options = {scope: scope};\n angular.forEach(['placement', 'container', 'delay', 'trigger', 'keyboard', 'html', 'animation', 'template', 'filter', 'limit', 'minLength', 'watchOptions', 'selectMode', 'comparator', 'id'], function(key) {\n if(angular.isDefined(attr[key])) options[key] = attr[key];\n });\n\n // Build proper ngOptions\n var filter = options.filter || defaults.filter;\n var limit = options.limit || defaults.limit;\n var comparator = options.comparator || defaults.comparator;\n\n var ngOptions = attr.ngOptions;\n if(filter) ngOptions += ' | ' + filter + ':$viewValue';\n if (comparator) ngOptions += ':' + comparator;\n if(limit) ngOptions += ' | limitTo:' + limit;\n var parsedOptions = $parseOptions(ngOptions);\n\n // Initialize typeahead\n var typeahead = $typeahead(element, controller, options);\n\n // Watch options on demand\n if(options.watchOptions) {\n // Watch ngOptions values before filtering for changes, drop function calls\n var watchedOptions = parsedOptions.$match[7].replace(/\\|.+/, '').replace(/\\(.*\\)/g, '').trim();\n scope.$watch(watchedOptions, function (newValue, oldValue) {\n // console.warn('scope.$watch(%s)', watchedOptions, newValue, oldValue);\n parsedOptions.valuesFn(scope, controller).then(function (values) {\n typeahead.update(values);\n controller.$render();\n });\n }, true);\n }\n\n // Watch model for changes\n scope.$watch(attr.ngModel, function(newValue, oldValue) {\n // console.warn('$watch', element.attr('ng-model'), newValue);\n scope.$modelValue = newValue; // Publish modelValue on scope for custom templates\n parsedOptions.valuesFn(scope, controller)\n .then(function(values) {\n // Prevent input with no future prospect if selectMode is truthy\n // @TODO test selectMode\n if(options.selectMode && !values.length && newValue.length > 0) {\n controller.$setViewValue(controller.$viewValue.substring(0, controller.$viewValue.length - 1));\n return;\n }\n if(values.length > limit) values = values.slice(0, limit);\n var isVisible = typeahead.$isVisible();\n isVisible && typeahead.update(values);\n // Do not re-queue an update if a correct value has been selected\n if(values.length === 1 && values[0].value === newValue) return;\n !isVisible && typeahead.update(values);\n // Queue a new rendering that will leverage collection loading\n controller.$render();\n });\n });\n\n // modelValue -> $formatters -> viewValue\n controller.$formatters.push(function(modelValue) {\n // console.warn('$formatter(\"%s\"): modelValue=%o (%o)', element.attr('ng-model'), modelValue, typeof modelValue);\n var displayValue = parsedOptions.displayValue(modelValue);\n return displayValue === undefined ? '' : displayValue;\n });\n\n // Model rendering in view\n controller.$render = function () {\n // console.warn('$render', element.attr('ng-model'), 'controller.$modelValue', typeof controller.$modelValue, controller.$modelValue, 'controller.$viewValue', typeof controller.$viewValue, controller.$viewValue);\n if(controller.$isEmpty(controller.$viewValue)) return element.val('');\n var index = typeahead.$getIndex(controller.$modelValue);\n var selected = angular.isDefined(index) ? typeahead.$scope.$matches[index].label : controller.$viewValue;\n selected = angular.isObject(selected) ? parsedOptions.displayValue(selected) : selected;\n element.val(selected ? selected.toString().replace(/<(?:.|\\n)*?>/gm, '').trim() : '');\n };\n\n // Garbage collection\n scope.$on('$destroy', function() {\n if (typeahead) typeahead.destroy();\n options = null;\n typeahead = null;\n });\n\n }\n };\n\n });\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.tpl.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.tpl.js deleted file mode 100644 index d85aa532..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.tpl.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * angular-strap - * @version v2.1.6 - 2015-01-11 - * @link http://mgcrea.github.io/angular-strap - * @author Olivier Louvignes (olivier@mg-crea.com) - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -(function(window, document, undefined) { -'use strict'; - -// Source: alert.tpl.js -angular.module('mgcrea.ngStrap.alert').run(['$templateCache', function($templateCache) { - - $templateCache.put('alert/alert.tpl.html', '
     
    '); - -}]); - -// Source: aside.tpl.js -angular.module('mgcrea.ngStrap.aside').run(['$templateCache', function($templateCache) { - - $templateCache.put('aside/aside.tpl.html', ''); - -}]); - -// Source: datepicker.tpl.js -angular.module('mgcrea.ngStrap.datepicker').run(['$templateCache', function($templateCache) { - - $templateCache.put('datepicker/datepicker.tpl.html', ''); - -}]); - -// Source: dropdown.tpl.js -angular.module('mgcrea.ngStrap.dropdown').run(['$templateCache', function($templateCache) { - - $templateCache.put('dropdown/dropdown.tpl.html', ''); - -}]); - -// Source: modal.tpl.js -angular.module('mgcrea.ngStrap.modal').run(['$templateCache', function($templateCache) { - - $templateCache.put('modal/modal.tpl.html', ''); - -}]); - -// Source: popover.tpl.js -angular.module('mgcrea.ngStrap.popover').run(['$templateCache', function($templateCache) { - - $templateCache.put('popover/popover.tpl.html', '

    '); - -}]); - -// Source: select.tpl.js -angular.module('mgcrea.ngStrap.select').run(['$templateCache', function($templateCache) { - - $templateCache.put('select/select.tpl.html', ''); - -}]); - -// Source: tab.tpl.js -angular.module('mgcrea.ngStrap.tab').run(['$templateCache', function($templateCache) { - - $templateCache.put('tab/tab.tpl.html', '
    '); - -}]); - -// Source: timepicker.tpl.js -angular.module('mgcrea.ngStrap.timepicker').run(['$templateCache', function($templateCache) { - - $templateCache.put('timepicker/timepicker.tpl.html', ''); - -}]); - -// Source: tooltip.tpl.js -angular.module('mgcrea.ngStrap.tooltip').run(['$templateCache', function($templateCache) { - - $templateCache.put('tooltip/tooltip.tpl.html', '
    '); - -}]); - -// Source: typeahead.tpl.js -angular.module('mgcrea.ngStrap.typeahead').run(['$templateCache', function($templateCache) { - - $templateCache.put('typeahead/typeahead.tpl.html', ''); - -}]); - - -})(window, document); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.tpl.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.tpl.min.js deleted file mode 100644 index c8f44b6e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-strap_2.1.6/angular-strap.tpl.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * angular-strap - * @version v2.1.6 - 2015-01-11 - * @link http://mgcrea.github.io/angular-strap - * @author Olivier Louvignes (olivier@mg-crea.com) - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -!function(){"use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(t){t.put("alert/alert.tpl.html",'
     
    ')}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(t){t.put("aside/aside.tpl.html",'')}]),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(t){t.put("datepicker/datepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.dropdown").run(["$templateCache",function(t){t.put("dropdown/dropdown.tpl.html",'')}]),angular.module("mgcrea.ngStrap.modal").run(["$templateCache",function(t){t.put("modal/modal.tpl.html",'')}]),angular.module("mgcrea.ngStrap.popover").run(["$templateCache",function(t){t.put("popover/popover.tpl.html",'

    ')}]),angular.module("mgcrea.ngStrap.select").run(["$templateCache",function(t){t.put("select/select.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tab").run(["$templateCache",function(t){t.put("tab/tab.tpl.html",'
    ')}]),angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(t){t.put("timepicker/timepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tooltip").run(["$templateCache",function(t){t.put("tooltip/tooltip.tpl.html",'
    ')}]),angular.module("mgcrea.ngStrap.typeahead").run(["$templateCache",function(t){t.put("typeahead/typeahead.tpl.html",'')}])}(window,document); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/.bower.json b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/.bower.json deleted file mode 100644 index d2b66a99..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/.bower.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "angular-translate-loader-static-files", - "version": "0.1.6", - "main": "./angular-translate-loader-static-files.js", - "dependencies": { - "angular": "1.0.8", - "angular-translate": "~1.1.1" - }, - "homepage": "https://github.com/PascalPrecht/bower-angular-translate-loader-static-files", - "_release": "0.1.6", - "_resolution": { - "type": "version", - "tag": "0.1.6", - "commit": "eaac546d29d6cde45873e6bad9d18cdff071d983" - }, - "_source": "git://github.com/PascalPrecht/bower-angular-translate-loader-static-files.git", - "_target": "0.1.6", - "_originalSource": "angular-translate-loader-static-files" -} \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js deleted file mode 100644 index a68fbc7f..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js +++ /dev/null @@ -1,112 +0,0 @@ -/*! - * angular-translate - v2.15.1 - 2017-03-04 - * - * Copyright (c) 2017 The angular-translate team, Pascal Precht; Licensed MIT - */ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module unless amdModuleId is set - define([], function () { - return (factory()); - }); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - factory(); - } -}(this, function () { - -$translateStaticFilesLoader.$inject = ['$q', '$http']; -angular.module('pascalprecht.translate') -/** - * @ngdoc object - * @name pascalprecht.translate.$translateStaticFilesLoader - * @requires $q - * @requires $http - * - * @description - * Creates a loading function for a typical static file url pattern: - * "lang-en_US.json", "lang-de_DE.json", etc. Using this builder, - * the response of these urls must be an object of key-value pairs. - * - * @param {object} options Options object, which gets prefix, suffix, key, and fileMap - */ -.factory('$translateStaticFilesLoader', $translateStaticFilesLoader); - -function $translateStaticFilesLoader($q, $http) { - - 'use strict'; - - return function (options) { - - if (!options || (!angular.isArray(options.files) && (!angular.isString(options.prefix) || !angular.isString(options.suffix)))) { - throw new Error('Couldn\'t load static files, no files and prefix or suffix specified!'); - } - - if (!options.files) { - options.files = [{ - prefix: options.prefix, - suffix: options.suffix - }]; - } - - var load = function (file) { - if (!file || (!angular.isString(file.prefix) || !angular.isString(file.suffix))) { - throw new Error('Couldn\'t load static file, no prefix or suffix specified!'); - } - - var fileUrl = [ - file.prefix, - options.key, - file.suffix - ].join(''); - - if (angular.isObject(options.fileMap) && options.fileMap[fileUrl]) { - fileUrl = options.fileMap[fileUrl]; - } - - return $http(angular.extend({ - url: fileUrl, - method: 'GET' - }, options.$http)) - .then(function(result) { - return result.data; - }, function () { - return $q.reject(options.key); - }); - }; - - var promises = [], - length = options.files.length; - - for (var i = 0; i < length; i++) { - promises.push(load({ - prefix: options.files[i].prefix, - key: options.key, - suffix: options.files[i].suffix - })); - } - - return $q.all(promises) - .then(function (data) { - var length = data.length, - mergedData = {}; - - for (var i = 0; i < length; i++) { - for (var key in data[i]) { - mergedData[key] = data[i][key]; - } - } - - return mergedData; - }); - }; -} - -$translateStaticFilesLoader.displayName = '$translateStaticFilesLoader'; -return 'pascalprecht.translate'; - -})); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js deleted file mode 100644 index 8ba0b602..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * angular-translate - v2.15.1 - 2017-03-04 - * - * Copyright (c) 2017 The angular-translate team, Pascal Precht; Licensed MIT - */ -!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){function a(a,b){"use strict";return function(c){if(!(c&&(angular.isArray(c.files)||angular.isString(c.prefix)&&angular.isString(c.suffix))))throw new Error("Couldn't load static files, no files and prefix or suffix specified!");c.files||(c.files=[{prefix:c.prefix,suffix:c.suffix}]);for(var d=function(d){if(!d||!angular.isString(d.prefix)||!angular.isString(d.suffix))throw new Error("Couldn't load static file, no prefix or suffix specified!");var e=[d.prefix,c.key,d.suffix].join("");return angular.isObject(c.fileMap)&&c.fileMap[e]&&(e=c.fileMap[e]),b(angular.extend({url:e,method:"GET"},c.$http)).then(function(a){return a.data},function(){return a.reject(c.key)})},e=[],f=c.files.length,g=0;g= 4) { - var $cookies = $injector.get('$cookies'); - delegate = { - get : function (key) { - return $cookies.get(key); - }, - put : function (key, value) { - $cookies.put(key, value); - } - }; - } else { - var $cookieStore = $injector.get('$cookieStore'); - delegate = { - get : function (key) { - return $cookieStore.get(key); - }, - put : function (key, value) { - $cookieStore.put(key, value); - } - }; - } - - var $translateCookieStorage = { - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateCookieStorage#get - * @methodOf pascalprecht.translate.$translateCookieStorage - * - * @description - * Returns an item from cookieStorage by given name. - * - * @param {string} name Item name - * @return {string} Value of item name - */ - get : function (name) { - return delegate.get(name); - }, - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateCookieStorage#set - * @methodOf pascalprecht.translate.$translateCookieStorage - * - * @description - * Sets an item in cookieStorage by given name. - * - * @deprecated use #put - * - * @param {string} name Item name - * @param {string} value Item value - */ - set : function (name, value) { - delegate.put(name, value); - }, - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateCookieStorage#put - * @methodOf pascalprecht.translate.$translateCookieStorage - * - * @description - * Sets an item in cookieStorage by given name. - * - * @param {string} name Item name - * @param {string} value Item value - */ - put : function (name, value) { - delegate.put(name, value); - } - }; - - return $translateCookieStorage; -} - -$translateCookieStorageFactory.displayName = '$translateCookieStorage'; -return 'pascalprecht.translate'; - -})); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js deleted file mode 100644 index 54467c58..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * angular-translate - v2.15.1 - 2017-03-04 - * - * Copyright (c) 2017 The angular-translate team, Pascal Precht; Licensed MIT - */ -!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){function a(a){"use strict";var b;if(1===angular.version.major&&angular.version.minor>=4){var c=a.get("$cookies");b={get:function(a){return c.get(a)},put:function(a,b){c.put(a,b)}}}else{var d=a.get("$cookieStore");b={get:function(a){return d.get(a)},put:function(a,b){d.put(a,b)}}}var e={get:function(a){return b.get(a)},set:function(a,c){b.put(a,c)},put:function(a,c){b.put(a,c)}};return e}return a.$inject=["$injector"],angular.module("pascalprecht.translate").factory("$translateCookieStorage",a),a.displayName="$translateCookieStorage","pascalprecht.translate"}); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate_2.15.1/angular-translate.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate_2.15.1/angular-translate.js deleted file mode 100644 index c2e2e142..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate_2.15.1/angular-translate.js +++ /dev/null @@ -1,3709 +0,0 @@ -/*! - * angular-translate - v2.15.1 - 2017-03-04 - * - * Copyright (c) 2017 The angular-translate team, Pascal Precht; Licensed MIT - */ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module unless amdModuleId is set - define([], function () { - return (factory()); - }); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(); - } else { - factory(); - } -}(this, function () { - -/** - * @ngdoc overview - * @name pascalprecht.translate - * - * @description - * The main module which holds everything together. - */ -runTranslate.$inject = ['$translate']; -$translate.$inject = ['$STORAGE_KEY', '$windowProvider', '$translateSanitizationProvider', 'pascalprechtTranslateOverrider']; -$translateDefaultInterpolation.$inject = ['$interpolate', '$translateSanitization']; -translateDirective.$inject = ['$translate', '$interpolate', '$compile', '$parse', '$rootScope']; -translateAttrDirective.$inject = ['$translate', '$rootScope']; -translateCloakDirective.$inject = ['$translate', '$rootScope']; -translateFilterFactory.$inject = ['$parse', '$translate']; -$translationCache.$inject = ['$cacheFactory']; -angular.module('pascalprecht.translate', ['ng']) - .run(runTranslate); - -function runTranslate($translate) { - - 'use strict'; - - var key = $translate.storageKey(), - storage = $translate.storage(); - - var fallbackFromIncorrectStorageValue = function () { - var preferred = $translate.preferredLanguage(); - if (angular.isString(preferred)) { - $translate.use(preferred); - // $translate.use() will also remember the language. - // So, we don't need to call storage.put() here. - } else { - storage.put(key, $translate.use()); - } - }; - - fallbackFromIncorrectStorageValue.displayName = 'fallbackFromIncorrectStorageValue'; - - if (storage) { - if (!storage.get(key)) { - fallbackFromIncorrectStorageValue(); - } else { - $translate.use(storage.get(key))['catch'](fallbackFromIncorrectStorageValue); - } - } else if (angular.isString($translate.preferredLanguage())) { - $translate.use($translate.preferredLanguage()); - } -} - -runTranslate.displayName = 'runTranslate'; - -/** - * @ngdoc object - * @name pascalprecht.translate.$translateSanitizationProvider - * - * @description - * - * Configurations for $translateSanitization - */ -angular.module('pascalprecht.translate').provider('$translateSanitization', $translateSanitizationProvider); - -function $translateSanitizationProvider () { - - 'use strict'; - - var $sanitize, - $sce, - currentStrategy = null, // TODO change to either 'sanitize', 'escape' or ['sanitize', 'escapeParameters'] in 3.0. - hasConfiguredStrategy = false, - hasShownNoStrategyConfiguredWarning = false, - strategies; - - /** - * Definition of a sanitization strategy function - * @callback StrategyFunction - * @param {string|object} value - value to be sanitized (either a string or an interpolated value map) - * @param {string} mode - either 'text' for a string (translation) or 'params' for the interpolated params - * @return {string|object} - */ - - /** - * @ngdoc property - * @name strategies - * @propertyOf pascalprecht.translate.$translateSanitizationProvider - * - * @description - * Following strategies are built-in: - *
    - *
    sanitize
    - *
    Sanitizes HTML in the translation text using $sanitize
    - *
    escape
    - *
    Escapes HTML in the translation
    - *
    sanitizeParameters
    - *
    Sanitizes HTML in the values of the interpolation parameters using $sanitize
    - *
    escapeParameters
    - *
    Escapes HTML in the values of the interpolation parameters
    - *
    escaped
    - *
    Support legacy strategy name 'escaped' for backwards compatibility (will be removed in 3.0)
    - *
    - * - */ - - strategies = { - sanitize: function (value, mode/*, context*/) { - if (mode === 'text') { - value = htmlSanitizeValue(value); - } - return value; - }, - escape: function (value, mode/*, context*/) { - if (mode === 'text') { - value = htmlEscapeValue(value); - } - return value; - }, - sanitizeParameters: function (value, mode/*, context*/) { - if (mode === 'params') { - value = mapInterpolationParameters(value, htmlSanitizeValue); - } - return value; - }, - escapeParameters: function (value, mode/*, context*/) { - if (mode === 'params') { - value = mapInterpolationParameters(value, htmlEscapeValue); - } - return value; - }, - sce: function (value, mode, context) { - if (mode === 'text') { - value = htmlTrustValue(value); - } else if (mode === 'params') { - if (context !== 'filter') { - // do html escape in filter context #1101 - value = mapInterpolationParameters(value, htmlEscapeValue); - } - } - return value; - }, - sceParameters: function (value, mode/*, context*/) { - if (mode === 'params') { - value = mapInterpolationParameters(value, htmlTrustValue); - } - return value; - } - }; - // Support legacy strategy name 'escaped' for backwards compatibility. - // TODO should be removed in 3.0 - strategies.escaped = strategies.escapeParameters; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateSanitizationProvider#addStrategy - * @methodOf pascalprecht.translate.$translateSanitizationProvider - * - * @description - * Adds a sanitization strategy to the list of known strategies. - * - * @param {string} strategyName - unique key for a strategy - * @param {StrategyFunction} strategyFunction - strategy function - * @returns {object} this - */ - this.addStrategy = function (strategyName, strategyFunction) { - strategies[strategyName] = strategyFunction; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateSanitizationProvider#removeStrategy - * @methodOf pascalprecht.translate.$translateSanitizationProvider - * - * @description - * Removes a sanitization strategy from the list of known strategies. - * - * @param {string} strategyName - unique key for a strategy - * @returns {object} this - */ - this.removeStrategy = function (strategyName) { - delete strategies[strategyName]; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateSanitizationProvider#useStrategy - * @methodOf pascalprecht.translate.$translateSanitizationProvider - * - * @description - * Selects a sanitization strategy. When an array is provided the strategies will be executed in order. - * - * @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions. - * @returns {object} this - */ - this.useStrategy = function (strategy) { - hasConfiguredStrategy = true; - currentStrategy = strategy; - return this; - }; - - /** - * @ngdoc object - * @name pascalprecht.translate.$translateSanitization - * @requires $injector - * @requires $log - * - * @description - * Sanitizes interpolation parameters and translated texts. - * - */ - this.$get = ['$injector', '$log', function ($injector, $log) { - - var cachedStrategyMap = {}; - - var applyStrategies = function (value, mode, context, selectedStrategies) { - angular.forEach(selectedStrategies, function (selectedStrategy) { - if (angular.isFunction(selectedStrategy)) { - value = selectedStrategy(value, mode, context); - } else if (angular.isFunction(strategies[selectedStrategy])) { - value = strategies[selectedStrategy](value, mode, context); - } else if (angular.isString(strategies[selectedStrategy])) { - if (!cachedStrategyMap[strategies[selectedStrategy]]) { - try { - cachedStrategyMap[strategies[selectedStrategy]] = $injector.get(strategies[selectedStrategy]); - } catch (e) { - cachedStrategyMap[strategies[selectedStrategy]] = function() {}; - throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \'' + selectedStrategy + '\''); - } - } - value = cachedStrategyMap[strategies[selectedStrategy]](value, mode, context); - } else { - throw new Error('pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: \'' + selectedStrategy + '\''); - } - }); - return value; - }; - - // TODO: should be removed in 3.0 - var showNoStrategyConfiguredWarning = function () { - if (!hasConfiguredStrategy && !hasShownNoStrategyConfiguredWarning) { - $log.warn('pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details.'); - hasShownNoStrategyConfiguredWarning = true; - } - }; - - if ($injector.has('$sanitize')) { - $sanitize = $injector.get('$sanitize'); - } - if ($injector.has('$sce')) { - $sce = $injector.get('$sce'); - } - - return { - /** - * @ngdoc function - * @name pascalprecht.translate.$translateSanitization#useStrategy - * @methodOf pascalprecht.translate.$translateSanitization - * - * @description - * Selects a sanitization strategy. When an array is provided the strategies will be executed in order. - * - * @param {string|StrategyFunction|array} strategy The sanitization strategy / strategies which should be used. Either a name of an existing strategy, a custom strategy function, or an array consisting of multiple names and / or custom functions. - */ - useStrategy: (function (self) { - return function (strategy) { - self.useStrategy(strategy); - }; - })(this), - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateSanitization#sanitize - * @methodOf pascalprecht.translate.$translateSanitization - * - * @description - * Sanitizes a value. - * - * @param {string|object} value The value which should be sanitized. - * @param {string} mode The current sanitization mode, either 'params' or 'text'. - * @param {string|StrategyFunction|array} [strategy] Optional custom strategy which should be used instead of the currently selected strategy. - * @param {string} [context] The context of this call: filter, service. Default is service - * @returns {string|object} sanitized value - */ - sanitize: function (value, mode, strategy, context) { - if (!currentStrategy) { - showNoStrategyConfiguredWarning(); - } - - if (!strategy && strategy !== null) { - strategy = currentStrategy; - } - - if (!strategy) { - return value; - } - - if (!context) { - context = 'service'; - } - - var selectedStrategies = angular.isArray(strategy) ? strategy : [strategy]; - return applyStrategies(value, mode, context, selectedStrategies); - } - }; - }]; - - var htmlEscapeValue = function (value) { - var element = angular.element('
    '); - element.text(value); // not chainable, see #1044 - return element.html(); - }; - - var htmlSanitizeValue = function (value) { - if (!$sanitize) { - throw new Error('pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as \'escape\'.'); - } - return $sanitize(value); - }; - - var htmlTrustValue = function (value) { - if (!$sce) { - throw new Error('pascalprecht.translate.$translateSanitization: Error cannot find $sce service.'); - } - return $sce.trustAsHtml(value); - }; - - var mapInterpolationParameters = function (value, iteratee, stack) { - if (angular.isDate(value)) { - return value; - } else if (angular.isObject(value)) { - var result = angular.isArray(value) ? [] : {}; - - if (!stack) { - stack = []; - } else { - if (stack.indexOf(value) > -1) { - throw new Error('pascalprecht.translate.$translateSanitization: Error cannot interpolate parameter due recursive object'); - } - } - - stack.push(value); - angular.forEach(value, function (propertyValue, propertyKey) { - - /* Skipping function properties. */ - if (angular.isFunction(propertyValue)) { - return; - } - - result[propertyKey] = mapInterpolationParameters(propertyValue, iteratee, stack); - }); - stack.splice(-1, 1); // remove last - - return result; - } else if (angular.isNumber(value)) { - return value; - } else if (!angular.isUndefined(value) && value !== null) { - return iteratee(value); - } else { - return value; - } - }; -} - -/** - * @ngdoc object - * @name pascalprecht.translate.$translateProvider - * @description - * - * $translateProvider allows developers to register translation-tables, asynchronous loaders - * and similar to configure translation behavior directly inside of a module. - * - */ -angular.module('pascalprecht.translate') - .constant('pascalprechtTranslateOverrider', {}) - .provider('$translate', $translate); - -function $translate($STORAGE_KEY, $windowProvider, $translateSanitizationProvider, pascalprechtTranslateOverrider) { - - 'use strict'; - - var $translationTable = {}, - $preferredLanguage, - $availableLanguageKeys = [], - $languageKeyAliases, - $fallbackLanguage, - $fallbackWasString, - $uses, - $nextLang, - $storageFactory, - $storageKey = $STORAGE_KEY, - $storagePrefix, - $missingTranslationHandlerFactory, - $interpolationFactory, - $interpolatorFactories = [], - $loaderFactory, - $cloakClassName = 'translate-cloak', - $loaderOptions, - $notFoundIndicatorLeft, - $notFoundIndicatorRight, - $postCompilingEnabled = false, - $forceAsyncReloadEnabled = false, - $nestedObjectDelimeter = '.', - $isReady = false, - $keepContent = false, - loaderCache, - directivePriority = 0, - statefulFilter = true, - postProcessFn, - uniformLanguageTagResolver = 'default', - languageTagResolver = { - 'default' : function (tag) { - return (tag || '').split('-').join('_'); - }, - java : function (tag) { - var temp = (tag || '').split('-').join('_'); - var parts = temp.split('_'); - return parts.length > 1 ? (parts[0].toLowerCase() + '_' + parts[1].toUpperCase()) : temp; - }, - bcp47 : function (tag) { - var temp = (tag || '').split('_').join('-'); - var parts = temp.split('-'); - return parts.length > 1 ? (parts[0].toLowerCase() + '-' + parts[1].toUpperCase()) : temp; - }, - 'iso639-1' : function (tag) { - var temp = (tag || '').split('_').join('-'); - var parts = temp.split('-'); - return parts[0].toLowerCase(); - } - }; - - var version = '2.15.1'; - - // tries to determine the browsers language - var getFirstBrowserLanguage = function () { - - // internal purpose only - if (angular.isFunction(pascalprechtTranslateOverrider.getLocale)) { - return pascalprechtTranslateOverrider.getLocale(); - } - - var nav = $windowProvider.$get().navigator, - browserLanguagePropertyKeys = ['language', 'browserLanguage', 'systemLanguage', 'userLanguage'], - i, - language; - - // support for HTML 5.1 "navigator.languages" - if (angular.isArray(nav.languages)) { - for (i = 0; i < nav.languages.length; i++) { - language = nav.languages[i]; - if (language && language.length) { - return language; - } - } - } - - // support for other well known properties in browsers - for (i = 0; i < browserLanguagePropertyKeys.length; i++) { - language = nav[browserLanguagePropertyKeys[i]]; - if (language && language.length) { - return language; - } - } - - return null; - }; - getFirstBrowserLanguage.displayName = 'angular-translate/service: getFirstBrowserLanguage'; - - // tries to determine the browsers locale - var getLocale = function () { - var locale = getFirstBrowserLanguage() || ''; - if (languageTagResolver[uniformLanguageTagResolver]) { - locale = languageTagResolver[uniformLanguageTagResolver](locale); - } - return locale; - }; - getLocale.displayName = 'angular-translate/service: getLocale'; - - /** - * @name indexOf - * @private - * - * @description - * indexOf polyfill. Kinda sorta. - * - * @param {array} array Array to search in. - * @param {string} searchElement Element to search for. - * - * @returns {int} Index of search element. - */ - var indexOf = function (array, searchElement) { - for (var i = 0, len = array.length; i < len; i++) { - if (array[i] === searchElement) { - return i; - } - } - return -1; - }; - - /** - * @name trim - * @private - * - * @description - * trim polyfill - * - * @returns {string} The string stripped of whitespace from both ends - */ - var trim = function () { - return this.toString().replace(/^\s+|\s+$/g, ''); - }; - - var negotiateLocale = function (preferred) { - if (!preferred) { - return; - } - - var avail = [], - locale = angular.lowercase(preferred), - i = 0, - n = $availableLanguageKeys.length; - - for (; i < n; i++) { - avail.push(angular.lowercase($availableLanguageKeys[i])); - } - - // Check for an exact match in our list of available keys - if (indexOf(avail, locale) > -1) { - return preferred; - } - - if ($languageKeyAliases) { - var alias; - for (var langKeyAlias in $languageKeyAliases) { - if ($languageKeyAliases.hasOwnProperty(langKeyAlias)) { - var hasWildcardKey = false; - var hasExactKey = Object.prototype.hasOwnProperty.call($languageKeyAliases, langKeyAlias) && - angular.lowercase(langKeyAlias) === angular.lowercase(preferred); - - if (langKeyAlias.slice(-1) === '*') { - hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length - 1); - } - if (hasExactKey || hasWildcardKey) { - alias = $languageKeyAliases[langKeyAlias]; - if (indexOf(avail, angular.lowercase(alias)) > -1) { - return alias; - } - } - } - } - } - - // Check for a language code without region - var parts = preferred.split('_'); - - if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) { - return parts[0]; - } - - // If everything fails, return undefined. - return; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#translations - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Registers a new translation table for specific language key. - * - * To register a translation table for specific language, pass a defined language - * key as first parameter. - * - *
    -   *  // register translation table for language: 'de_DE'
    -   *  $translateProvider.translations('de_DE', {
    -   *    'GREETING': 'Hallo Welt!'
    -   *  });
    -   *
    -   *  // register another one
    -   *  $translateProvider.translations('en_US', {
    -   *    'GREETING': 'Hello world!'
    -   *  });
    -   * 
    - * - * When registering multiple translation tables for for the same language key, - * the actual translation table gets extended. This allows you to define module - * specific translation which only get added, once a specific module is loaded in - * your app. - * - * Invoking this method with no arguments returns the translation table which was - * registered with no language key. Invoking it with a language key returns the - * related translation table. - * - * @param {string} langKey A language key. - * @param {object} translationTable A plain old JavaScript object that represents a translation table. - * - */ - var translations = function (langKey, translationTable) { - - if (!langKey && !translationTable) { - return $translationTable; - } - - if (langKey && !translationTable) { - if (angular.isString(langKey)) { - return $translationTable[langKey]; - } - } else { - if (!angular.isObject($translationTable[langKey])) { - $translationTable[langKey] = {}; - } - angular.extend($translationTable[langKey], flatObject(translationTable)); - } - return this; - }; - - this.translations = translations; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#cloakClassName - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * - * Let's you change the class name for `translate-cloak` directive. - * Default class name is `translate-cloak`. - * - * @param {string} name translate-cloak class name - */ - this.cloakClassName = function (name) { - if (!name) { - return $cloakClassName; - } - $cloakClassName = name; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#nestedObjectDelimeter - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * - * Let's you change the delimiter for namespaced translations. - * Default delimiter is `.`. - * - * @param {string} delimiter namespace separator - */ - this.nestedObjectDelimeter = function (delimiter) { - if (!delimiter) { - return $nestedObjectDelimeter; - } - $nestedObjectDelimeter = delimiter; - return this; - }; - - /** - * @name flatObject - * @private - * - * @description - * Flats an object. This function is used to flatten given translation data with - * namespaces, so they are later accessible via dot notation. - */ - var flatObject = function (data, path, result, prevKey) { - var key, keyWithPath, keyWithShortPath, val; - - if (!path) { - path = []; - } - if (!result) { - result = {}; - } - for (key in data) { - if (!Object.prototype.hasOwnProperty.call(data, key)) { - continue; - } - val = data[key]; - if (angular.isObject(val)) { - flatObject(val, path.concat(key), result, key); - } else { - keyWithPath = path.length ? ('' + path.join($nestedObjectDelimeter) + $nestedObjectDelimeter + key) : key; - if (path.length && key === prevKey) { - // Create shortcut path (foo.bar == foo.bar.bar) - keyWithShortPath = '' + path.join($nestedObjectDelimeter); - // Link it to original path - result[keyWithShortPath] = '@:' + keyWithPath; - } - result[keyWithPath] = val; - } - } - return result; - }; - flatObject.displayName = 'flatObject'; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#addInterpolation - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Adds interpolation services to angular-translate, so it can manage them. - * - * @param {object} factory Interpolation service factory - */ - this.addInterpolation = function (factory) { - $interpolatorFactories.push(factory); - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useMessageFormatInterpolation - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use interpolation functionality of messageformat.js. - * This is useful when having high level pluralization and gender selection. - */ - this.useMessageFormatInterpolation = function () { - return this.useInterpolation('$translateMessageFormatInterpolation'); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useInterpolation - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate which interpolation style to use as default, application-wide. - * Simply pass a factory/service name. The interpolation service has to implement - * the correct interface. - * - * @param {string} factory Interpolation service name. - */ - this.useInterpolation = function (factory) { - $interpolationFactory = factory; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useSanitizeStrategy - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Simply sets a sanitation strategy type. - * - * @param {string} value Strategy type. - */ - this.useSanitizeValueStrategy = function (value) { - $translateSanitizationProvider.useStrategy(value); - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#preferredLanguage - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells the module which of the registered translation tables to use for translation - * at initial startup by passing a language key. Similar to `$translateProvider#use` - * only that it says which language to **prefer**. - * - * @param {string} langKey A language key. - */ - this.preferredLanguage = function (langKey) { - if (langKey) { - setupPreferredLanguage(langKey); - return this; - } - return $preferredLanguage; - }; - var setupPreferredLanguage = function (langKey) { - if (langKey) { - $preferredLanguage = langKey; - } - return $preferredLanguage; - }; - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicator - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Sets an indicator which is used when a translation isn't found. E.g. when - * setting the indicator as 'X' and one tries to translate a translation id - * called `NOT_FOUND`, this will result in `X NOT_FOUND X`. - * - * Internally this methods sets a left indicator and a right indicator using - * `$translateProvider.translationNotFoundIndicatorLeft()` and - * `$translateProvider.translationNotFoundIndicatorRight()`. - * - * **Note**: These methods automatically add a whitespace between the indicators - * and the translation id. - * - * @param {string} indicator An indicator, could be any string. - */ - this.translationNotFoundIndicator = function (indicator) { - this.translationNotFoundIndicatorLeft(indicator); - this.translationNotFoundIndicatorRight(indicator); - return this; - }; - - /** - * ngdoc function - * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicatorLeft - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Sets an indicator which is used when a translation isn't found left to the - * translation id. - * - * @param {string} indicator An indicator. - */ - this.translationNotFoundIndicatorLeft = function (indicator) { - if (!indicator) { - return $notFoundIndicatorLeft; - } - $notFoundIndicatorLeft = indicator; - return this; - }; - - /** - * ngdoc function - * @name pascalprecht.translate.$translateProvider#translationNotFoundIndicatorLeft - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Sets an indicator which is used when a translation isn't found right to the - * translation id. - * - * @param {string} indicator An indicator. - */ - this.translationNotFoundIndicatorRight = function (indicator) { - if (!indicator) { - return $notFoundIndicatorRight; - } - $notFoundIndicatorRight = indicator; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#fallbackLanguage - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells the module which of the registered translation tables to use when missing translations - * at initial startup by passing a language key. Similar to `$translateProvider#use` - * only that it says which language to **fallback**. - * - * @param {string||array} langKey A language key. - * - */ - this.fallbackLanguage = function (langKey) { - fallbackStack(langKey); - return this; - }; - - var fallbackStack = function (langKey) { - if (langKey) { - if (angular.isString(langKey)) { - $fallbackWasString = true; - $fallbackLanguage = [langKey]; - } else if (angular.isArray(langKey)) { - $fallbackWasString = false; - $fallbackLanguage = langKey; - } - if (angular.isString($preferredLanguage) && indexOf($fallbackLanguage, $preferredLanguage) < 0) { - $fallbackLanguage.push($preferredLanguage); - } - - return this; - } else { - if ($fallbackWasString) { - return $fallbackLanguage[0]; - } else { - return $fallbackLanguage; - } - } - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#use - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Set which translation table to use for translation by given language key. When - * trying to 'use' a language which isn't provided, it'll throw an error. - * - * You actually don't have to use this method since `$translateProvider#preferredLanguage` - * does the job too. - * - * @param {string} langKey A language key. - */ - this.use = function (langKey) { - if (langKey) { - if (!$translationTable[langKey] && (!$loaderFactory)) { - // only throw an error, when not loading translation data asynchronously - throw new Error('$translateProvider couldn\'t find translationTable for langKey: \'' + langKey + '\''); - } - $uses = langKey; - return this; - } - return $uses; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#resolveClientLocale - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * This returns the current browser/client's language key. The result is processed with the configured uniform tag resolver. - * - * @returns {string} the current client/browser language key - */ - this.resolveClientLocale = function () { - return getLocale(); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#storageKey - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells the module which key must represent the choosed language by a user in the storage. - * - * @param {string} key A key for the storage. - */ - var storageKey = function (key) { - if (!key) { - if ($storagePrefix) { - return $storagePrefix + $storageKey; - } - return $storageKey; - } - $storageKey = key; - return this; - }; - - this.storageKey = storageKey; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useUrlLoader - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use `$translateUrlLoader` extension service as loader. - * - * @param {string} url Url - * @param {Object=} options Optional configuration object - */ - this.useUrlLoader = function (url, options) { - return this.useLoader('$translateUrlLoader', angular.extend({url : url}, options)); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useStaticFilesLoader - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use `$translateStaticFilesLoader` extension service as loader. - * - * @param {Object=} options Optional configuration object - */ - this.useStaticFilesLoader = function (options) { - return this.useLoader('$translateStaticFilesLoader', options); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useLoader - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use any other service as loader. - * - * @param {string} loaderFactory Factory name to use - * @param {Object=} options Optional configuration object - */ - this.useLoader = function (loaderFactory, options) { - $loaderFactory = loaderFactory; - $loaderOptions = options || {}; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useLocalStorage - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use `$translateLocalStorage` service as storage layer. - * - */ - this.useLocalStorage = function () { - return this.useStorage('$translateLocalStorage'); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useCookieStorage - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use `$translateCookieStorage` service as storage layer. - */ - this.useCookieStorage = function () { - return this.useStorage('$translateCookieStorage'); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useStorage - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use custom service as storage layer. - */ - this.useStorage = function (storageFactory) { - $storageFactory = storageFactory; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#storagePrefix - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Sets prefix for storage key. - * - * @param {string} prefix Storage key prefix - */ - this.storagePrefix = function (prefix) { - if (!prefix) { - return prefix; - } - $storagePrefix = prefix; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useMissingTranslationHandlerLog - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to use built-in log handler when trying to translate - * a translation Id which doesn't exist. - * - * This is actually a shortcut method for `useMissingTranslationHandler()`. - * - */ - this.useMissingTranslationHandlerLog = function () { - return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog'); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useMissingTranslationHandler - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Expects a factory name which later gets instantiated with `$injector`. - * This method can be used to tell angular-translate to use a custom - * missingTranslationHandler. Just build a factory which returns a function - * and expects a translation id as argument. - * - * Example: - *
    -   *  app.config(function ($translateProvider) {
    -   *    $translateProvider.useMissingTranslationHandler('customHandler');
    -   *  });
    -   *
    -   *  app.factory('customHandler', function (dep1, dep2) {
    -   *    return function (translationId) {
    -   *      // something with translationId and dep1 and dep2
    -   *    };
    -   *  });
    -   * 
    - * - * @param {string} factory Factory name - */ - this.useMissingTranslationHandler = function (factory) { - $missingTranslationHandlerFactory = factory; - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#usePostCompiling - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * If post compiling is enabled, all translated values will be processed - * again with AngularJS' $compile. - * - * Example: - *
    -   *  app.config(function ($translateProvider) {
    -   *    $translateProvider.usePostCompiling(true);
    -   *  });
    -   * 
    - * - * @param {string} factory Factory name - */ - this.usePostCompiling = function (value) { - $postCompilingEnabled = !(!value); - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#forceAsyncReload - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * If force async reload is enabled, async loader will always be called - * even if $translationTable already contains the language key, adding - * possible new entries to the $translationTable. - * - * Example: - *
    -   *  app.config(function ($translateProvider) {
    -   *    $translateProvider.forceAsyncReload(true);
    -   *  });
    -   * 
    - * - * @param {boolean} value - valid values are true or false - */ - this.forceAsyncReload = function (value) { - $forceAsyncReloadEnabled = !(!value); - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#uniformLanguageTag - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate which language tag should be used as a result when determining - * the current browser language. - * - * This setting must be set before invoking {@link pascalprecht.translate.$translateProvider#methods_determinePreferredLanguage determinePreferredLanguage()}. - * - *
    -   * $translateProvider
    -   *   .uniformLanguageTag('bcp47')
    -   *   .determinePreferredLanguage()
    -   * 
    - * - * The resolver currently supports: - * * default - * (traditionally: hyphens will be converted into underscores, i.e. en-US => en_US) - * en-US => en_US - * en_US => en_US - * en-us => en_us - * * java - * like default, but the second part will be always in uppercase - * en-US => en_US - * en_US => en_US - * en-us => en_US - * * BCP 47 (RFC 4646 & 4647) - * en-US => en-US - * en_US => en-US - * en-us => en-US - * - * See also: - * * http://en.wikipedia.org/wiki/IETF_language_tag - * * http://www.w3.org/International/core/langtags/ - * * http://tools.ietf.org/html/bcp47 - * - * @param {string|object} options - options (or standard) - * @param {string} options.standard - valid values are 'default', 'bcp47', 'java' - */ - this.uniformLanguageTag = function (options) { - - if (!options) { - options = {}; - } else if (angular.isString(options)) { - options = { - standard : options - }; - } - - uniformLanguageTagResolver = options.standard; - - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#determinePreferredLanguage - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Tells angular-translate to try to determine on its own which language key - * to set as preferred language. When `fn` is given, angular-translate uses it - * to determine a language key, otherwise it uses the built-in `getLocale()` - * method. - * - * The `getLocale()` returns a language key in the format `[lang]_[country]` or - * `[lang]` depending on what the browser provides. - * - * Use this method at your own risk, since not all browsers return a valid - * locale (see {@link pascalprecht.translate.$translateProvider#methods_uniformLanguageTag uniformLanguageTag()}). - * - * @param {Function=} fn Function to determine a browser's locale - */ - this.determinePreferredLanguage = function (fn) { - - var locale = (fn && angular.isFunction(fn)) ? fn() : getLocale(); - - if (!$availableLanguageKeys.length) { - $preferredLanguage = locale; - } else { - $preferredLanguage = negotiateLocale(locale) || locale; - } - - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#registerAvailableLanguageKeys - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Registers a set of language keys the app will work with. Use this method in - * combination with - * {@link pascalprecht.translate.$translateProvider#determinePreferredLanguage determinePreferredLanguage}. - * When available languages keys are registered, angular-translate - * tries to find the best fitting language key depending on the browsers locale, - * considering your language key convention. - * - * @param {object} languageKeys Array of language keys the your app will use - * @param {object=} aliases Alias map. - */ - this.registerAvailableLanguageKeys = function (languageKeys, aliases) { - if (languageKeys) { - $availableLanguageKeys = languageKeys; - if (aliases) { - $languageKeyAliases = aliases; - } - return this; - } - return $availableLanguageKeys; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#useLoaderCache - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Registers a cache for internal $http based loaders. - * {@link pascalprecht.translate.$translationCache $translationCache}. - * When false the cache will be disabled (default). When true or undefined - * the cache will be a default (see $cacheFactory). When an object it will - * be treat as a cache object itself: the usage is $http({cache: cache}) - * - * @param {object} cache boolean, string or cache-object - */ - this.useLoaderCache = function (cache) { - if (cache === false) { - // disable cache - loaderCache = undefined; - } else if (cache === true) { - // enable cache using AJS defaults - loaderCache = true; - } else if (typeof(cache) === 'undefined') { - // enable cache using default - loaderCache = '$translationCache'; - } else if (cache) { - // enable cache using given one (see $cacheFactory) - loaderCache = cache; - } - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#directivePriority - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Sets the default priority of the translate directive. The standard value is `0`. - * Calling this function without an argument will return the current value. - * - * @param {number} priority for the translate-directive - */ - this.directivePriority = function (priority) { - if (priority === undefined) { - // getter - return directivePriority; - } else { - // setter with chaining - directivePriority = priority; - return this; - } - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#statefulFilter - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * Since AngularJS 1.3, filters which are not stateless (depending at the scope) - * have to explicit define this behavior. - * Sets whether the translate filter should be stateful or stateless. The standard value is `true` - * meaning being stateful. - * Calling this function without an argument will return the current value. - * - * @param {boolean} state - defines the state of the filter - */ - this.statefulFilter = function (state) { - if (state === undefined) { - // getter - return statefulFilter; - } else { - // setter with chaining - statefulFilter = state; - return this; - } - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#postProcess - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * The post processor will be intercept right after the translation result. It can modify the result. - * - * @param {object} fn Function or service name (string) to be called after the translation value has been set / resolved. The function itself will enrich every value being processed and then continue the normal resolver process - */ - this.postProcess = function (fn) { - if (fn) { - postProcessFn = fn; - } else { - postProcessFn = undefined; - } - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateProvider#keepContent - * @methodOf pascalprecht.translate.$translateProvider - * - * @description - * If keepContent is set to true than translate directive will always use innerHTML - * as a default translation - * - * Example: - *
    -   *  app.config(function ($translateProvider) {
    -   *    $translateProvider.keepContent(true);
    -   *  });
    -   * 
    - * - * @param {boolean} value - valid values are true or false - */ - this.keepContent = function (value) { - $keepContent = !(!value); - return this; - }; - - /** - * @ngdoc object - * @name pascalprecht.translate.$translate - * @requires $interpolate - * @requires $log - * @requires $rootScope - * @requires $q - * - * @description - * The `$translate` service is the actual core of angular-translate. It expects a translation id - * and optional interpolate parameters to translate contents. - * - *
    -   *  $translate('HEADLINE_TEXT').then(function (translation) {
    -   *    $scope.translatedText = translation;
    -   *  });
    -   * 
    - * - * @param {string|array} translationId A token which represents a translation id - * This can be optionally an array of translation ids which - * results that the function returns an object where each key - * is the translation id and the value the translation. - * @param {object=} interpolateParams An object hash for dynamic values - * @param {string} interpolationId The id of the interpolation to use - * @param {string} defaultTranslationText the optional default translation text that is written as - * as default text in case it is not found in any configured language - * @param {string} forceLanguage A language to be used instead of the current language - * @returns {object} promise - */ - this.$get = ['$log', '$injector', '$rootScope', '$q', function ($log, $injector, $rootScope, $q) { - - var Storage, - defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'), - pendingLoader = false, - interpolatorHashMap = {}, - langPromises = {}, - fallbackIndex, - startFallbackIteration; - - var $translate = function (translationId, interpolateParams, interpolationId, defaultTranslationText, forceLanguage) { - if (!$uses && $preferredLanguage) { - $uses = $preferredLanguage; - } - var uses = (forceLanguage && forceLanguage !== $uses) ? // we don't want to re-negotiate $uses - (negotiateLocale(forceLanguage) || forceLanguage) : $uses; - - // Check forceLanguage is present - if (forceLanguage) { - loadTranslationsIfMissing(forceLanguage); - } - - // Duck detection: If the first argument is an array, a bunch of translations was requested. - // The result is an object. - if (angular.isArray(translationId)) { - // Inspired by Q.allSettled by Kris Kowal - // https://github.com/kriskowal/q/blob/b0fa72980717dc202ffc3cbf03b936e10ebbb9d7/q.js#L1553-1563 - // This transforms all promises regardless resolved or rejected - var translateAll = function (translationIds) { - var results = {}; // storing the actual results - var promises = []; // promises to wait for - // Wraps the promise a) being always resolved and b) storing the link id->value - var translate = function (translationId) { - var deferred = $q.defer(); - var regardless = function (value) { - results[translationId] = value; - deferred.resolve([translationId, value]); - }; - // we don't care whether the promise was resolved or rejected; just store the values - $translate(translationId, interpolateParams, interpolationId, defaultTranslationText, forceLanguage).then(regardless, regardless); - return deferred.promise; - }; - for (var i = 0, c = translationIds.length; i < c; i++) { - promises.push(translate(translationIds[i])); - } - // wait for all (including storing to results) - return $q.all(promises).then(function () { - // return the results - return results; - }); - }; - return translateAll(translationId); - } - - var deferred = $q.defer(); - - // trim off any whitespace - if (translationId) { - translationId = trim.apply(translationId); - } - - var promiseToWaitFor = (function () { - var promise = $preferredLanguage ? - langPromises[$preferredLanguage] : - langPromises[uses]; - - fallbackIndex = 0; - - if ($storageFactory && !promise) { - // looks like there's no pending promise for $preferredLanguage or - // $uses. Maybe there's one pending for a language that comes from - // storage. - var langKey = Storage.get($storageKey); - promise = langPromises[langKey]; - - if ($fallbackLanguage && $fallbackLanguage.length) { - var index = indexOf($fallbackLanguage, langKey); - // maybe the language from storage is also defined as fallback language - // we increase the fallback language index to not search in that language - // as fallback, since it's probably the first used language - // in that case the index starts after the first element - fallbackIndex = (index === 0) ? 1 : 0; - - // but we can make sure to ALWAYS fallback to preferred language at least - if (indexOf($fallbackLanguage, $preferredLanguage) < 0) { - $fallbackLanguage.push($preferredLanguage); - } - } - } - return promise; - }()); - - if (!promiseToWaitFor) { - // no promise to wait for? okay. Then there's no loader registered - // nor is a one pending for language that comes from storage. - // We can just translate. - determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText, uses).then(deferred.resolve, deferred.reject); - } else { - var promiseResolved = function () { - // $uses may have changed while waiting - if (!forceLanguage) { - uses = $uses; - } - determineTranslation(translationId, interpolateParams, interpolationId, defaultTranslationText, uses).then(deferred.resolve, deferred.reject); - }; - promiseResolved.displayName = 'promiseResolved'; - - promiseToWaitFor['finally'](promiseResolved) - .catch(angular.noop); // we don't care about errors here, already handled - } - return deferred.promise; - }; - - /** - * @name applyNotFoundIndicators - * @private - * - * @description - * Applies not fount indicators to given translation id, if needed. - * This function gets only executed, if a translation id doesn't exist, - * which is why a translation id is expected as argument. - * - * @param {string} translationId Translation id. - * @returns {string} Same as given translation id but applied with not found - * indicators. - */ - var applyNotFoundIndicators = function (translationId) { - // applying notFoundIndicators - if ($notFoundIndicatorLeft) { - translationId = [$notFoundIndicatorLeft, translationId].join(' '); - } - if ($notFoundIndicatorRight) { - translationId = [translationId, $notFoundIndicatorRight].join(' '); - } - return translationId; - }; - - /** - * @name useLanguage - * @private - * - * @description - * Makes actual use of a language by setting a given language key as used - * language and informs registered interpolators to also use the given - * key as locale. - * - * @param {string} key Locale key. - */ - var useLanguage = function (key) { - $uses = key; - - // make sure to store new language key before triggering success event - if ($storageFactory) { - Storage.put($translate.storageKey(), $uses); - } - - $rootScope.$emit('$translateChangeSuccess', {language : key}); - - // inform default interpolator - defaultInterpolator.setLocale($uses); - - var eachInterpolator = function (interpolator, id) { - interpolatorHashMap[id].setLocale($uses); - }; - eachInterpolator.displayName = 'eachInterpolatorLocaleSetter'; - - // inform all others too! - angular.forEach(interpolatorHashMap, eachInterpolator); - $rootScope.$emit('$translateChangeEnd', {language : key}); - }; - - /** - * @name loadAsync - * @private - * - * @description - * Kicks off registered async loader using `$injector` and applies existing - * loader options. When resolved, it updates translation tables accordingly - * or rejects with given language key. - * - * @param {string} key Language key. - * @return {Promise} A promise. - */ - var loadAsync = function (key) { - if (!key) { - throw 'No language key specified for loading.'; - } - - var deferred = $q.defer(); - - $rootScope.$emit('$translateLoadingStart', {language : key}); - pendingLoader = true; - - var cache = loaderCache; - if (typeof(cache) === 'string') { - // getting on-demand instance of loader - cache = $injector.get(cache); - } - - var loaderOptions = angular.extend({}, $loaderOptions, { - key : key, - $http : angular.extend({}, { - cache : cache - }, $loaderOptions.$http) - }); - - var onLoaderSuccess = function (data) { - var translationTable = {}; - $rootScope.$emit('$translateLoadingSuccess', {language : key}); - - if (angular.isArray(data)) { - angular.forEach(data, function (table) { - angular.extend(translationTable, flatObject(table)); - }); - } else { - angular.extend(translationTable, flatObject(data)); - } - pendingLoader = false; - deferred.resolve({ - key : key, - table : translationTable - }); - $rootScope.$emit('$translateLoadingEnd', {language : key}); - }; - onLoaderSuccess.displayName = 'onLoaderSuccess'; - - var onLoaderError = function (key) { - $rootScope.$emit('$translateLoadingError', {language : key}); - deferred.reject(key); - $rootScope.$emit('$translateLoadingEnd', {language : key}); - }; - onLoaderError.displayName = 'onLoaderError'; - - $injector.get($loaderFactory)(loaderOptions) - .then(onLoaderSuccess, onLoaderError); - - return deferred.promise; - }; - - if ($storageFactory) { - Storage = $injector.get($storageFactory); - - if (!Storage.get || !Storage.put) { - throw new Error('Couldn\'t use storage \'' + $storageFactory + '\', missing get() or put() method!'); - } - } - - // if we have additional interpolations that were added via - // $translateProvider.addInterpolation(), we have to map'em - if ($interpolatorFactories.length) { - var eachInterpolationFactory = function (interpolatorFactory) { - var interpolator = $injector.get(interpolatorFactory); - // setting initial locale for each interpolation service - interpolator.setLocale($preferredLanguage || $uses); - // make'em recognizable through id - interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator; - }; - eachInterpolationFactory.displayName = 'interpolationFactoryAdder'; - - angular.forEach($interpolatorFactories, eachInterpolationFactory); - } - - /** - * @name getTranslationTable - * @private - * - * @description - * Returns a promise that resolves to the translation table - * or is rejected if an error occurred. - * - * @param langKey - * @returns {Q.promise} - */ - var getTranslationTable = function (langKey) { - var deferred = $q.defer(); - if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) { - deferred.resolve($translationTable[langKey]); - } else if (langPromises[langKey]) { - var onResolve = function (data) { - translations(data.key, data.table); - deferred.resolve(data.table); - }; - onResolve.displayName = 'translationTableResolver'; - langPromises[langKey].then(onResolve, deferred.reject); - } else { - deferred.reject(); - } - return deferred.promise; - }; - - /** - * @name getFallbackTranslation - * @private - * - * @description - * Returns a promise that will resolve to the translation - * or be rejected if no translation was found for the language. - * This function is currently only used for fallback language translation. - * - * @param langKey The language to translate to. - * @param translationId - * @param interpolateParams - * @param Interpolator - * @param sanitizeStrategy - * @returns {Q.promise} - */ - var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy) { - var deferred = $q.defer(); - - var onResolve = function (translationTable) { - if (Object.prototype.hasOwnProperty.call(translationTable, translationId) && translationTable[translationId] !== null) { - Interpolator.setLocale(langKey); - var translation = translationTable[translationId]; - if (translation.substr(0, 2) === '@:') { - getFallbackTranslation(langKey, translation.substr(2), interpolateParams, Interpolator, sanitizeStrategy) - .then(deferred.resolve, deferred.reject); - } else { - var interpolatedValue = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'service', sanitizeStrategy, translationId); - interpolatedValue = applyPostProcessing(translationId, translationTable[translationId], interpolatedValue, interpolateParams, langKey); - - deferred.resolve(interpolatedValue); - - } - Interpolator.setLocale($uses); - } else { - deferred.reject(); - } - }; - onResolve.displayName = 'fallbackTranslationResolver'; - - getTranslationTable(langKey).then(onResolve, deferred.reject); - - return deferred.promise; - }; - - /** - * @name getFallbackTranslationInstant - * @private - * - * @description - * Returns a translation - * This function is currently only used for fallback language translation. - * - * @param langKey The language to translate to. - * @param translationId - * @param interpolateParams - * @param Interpolator - * @param sanitizeStrategy sanitize strategy override - * - * @returns {string} translation - */ - var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy) { - var result, translationTable = $translationTable[langKey]; - - if (translationTable && Object.prototype.hasOwnProperty.call(translationTable, translationId) && translationTable[translationId] !== null) { - Interpolator.setLocale(langKey); - result = Interpolator.interpolate(translationTable[translationId], interpolateParams, 'filter', sanitizeStrategy, translationId); - result = applyPostProcessing(translationId, translationTable[translationId], result, interpolateParams, langKey, sanitizeStrategy); - // workaround for TrustedValueHolderType - if (!angular.isString(result) && angular.isFunction(result.$$unwrapTrustedValue)) { - var result2 = result.$$unwrapTrustedValue(); - if (result2.substr(0, 2) === '@:') { - return getFallbackTranslationInstant(langKey, result2.substr(2), interpolateParams, Interpolator, sanitizeStrategy); - } - } else if (result.substr(0, 2) === '@:') { - return getFallbackTranslationInstant(langKey, result.substr(2), interpolateParams, Interpolator, sanitizeStrategy); - } - Interpolator.setLocale($uses); - } - - return result; - }; - - - /** - * @name translateByHandler - * @private - * - * Translate by missing translation handler. - * - * @param translationId - * @param interpolateParams - * @param defaultTranslationText - * @param sanitizeStrategy sanitize strategy override - * - * @returns translation created by $missingTranslationHandler or translationId is $missingTranslationHandler is - * absent - */ - var translateByHandler = function (translationId, interpolateParams, defaultTranslationText, sanitizeStrategy) { - // If we have a handler factory - we might also call it here to determine if it provides - // a default text for a translationid that can't be found anywhere in our tables - if ($missingTranslationHandlerFactory) { - return $injector.get($missingTranslationHandlerFactory)(translationId, $uses, interpolateParams, defaultTranslationText, sanitizeStrategy); - } else { - return translationId; - } - }; - - /** - * @name resolveForFallbackLanguage - * @private - * - * Recursive helper function for fallbackTranslation that will sequentially look - * for a translation in the fallbackLanguages starting with fallbackLanguageIndex. - * - * @param fallbackLanguageIndex - * @param translationId - * @param interpolateParams - * @param Interpolator - * @param defaultTranslationText - * @param sanitizeStrategy - * @returns {Q.promise} Promise that will resolve to the translation. - */ - var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy) { - var deferred = $q.defer(); - - if (fallbackLanguageIndex < $fallbackLanguage.length) { - var langKey = $fallbackLanguage[fallbackLanguageIndex]; - getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy).then( - function (data) { - deferred.resolve(data); - }, - function () { - // Look in the next fallback language for a translation. - // It delays the resolving by passing another promise to resolve. - return resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy).then(deferred.resolve, deferred.reject); - } - ); - } else { - // No translation found in any fallback language - // if a default translation text is set in the directive, then return this as a result - if (defaultTranslationText) { - deferred.resolve(defaultTranslationText); - } else { - var missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, defaultTranslationText); - - // if no default translation is set and an error handler is defined, send it to the handler - // and then return the result if it isn't undefined - if ($missingTranslationHandlerFactory && missingTranslationHandlerTranslation) { - deferred.resolve(missingTranslationHandlerTranslation); - } else { - deferred.reject(applyNotFoundIndicators(translationId)); - } - } - } - return deferred.promise; - }; - - /** - * @name resolveForFallbackLanguageInstant - * @private - * - * Recursive helper function for fallbackTranslation that will sequentially look - * for a translation in the fallbackLanguages starting with fallbackLanguageIndex. - * - * @param fallbackLanguageIndex - * @param translationId - * @param interpolateParams - * @param Interpolator - * @param sanitizeStrategy - * @returns {string} translation - */ - var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator, sanitizeStrategy) { - var result; - - if (fallbackLanguageIndex < $fallbackLanguage.length) { - var langKey = $fallbackLanguage[fallbackLanguageIndex]; - result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator, sanitizeStrategy); - if (!result && result !== '') { - result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator); - } - } - return result; - }; - - /** - * Translates with the usage of the fallback languages. - * - * @param translationId - * @param interpolateParams - * @param Interpolator - * @param defaultTranslationText - * @param sanitizeStrategy - * @returns {Q.promise} Promise, that resolves to the translation. - */ - var fallbackTranslation = function (translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy) { - // Start with the fallbackLanguage with index 0 - return resolveForFallbackLanguage((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy); - }; - - /** - * Translates with the usage of the fallback languages. - * - * @param translationId - * @param interpolateParams - * @param Interpolator - * @param sanitizeStrategy - * @returns {String} translation - */ - var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator, sanitizeStrategy) { - // Start with the fallbackLanguage with index 0 - return resolveForFallbackLanguageInstant((startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex), translationId, interpolateParams, Interpolator, sanitizeStrategy); - }; - - var determineTranslation = function (translationId, interpolateParams, interpolationId, defaultTranslationText, uses, sanitizeStrategy) { - - var deferred = $q.defer(); - - var table = uses ? $translationTable[uses] : $translationTable, - Interpolator = (interpolationId) ? interpolatorHashMap[interpolationId] : defaultInterpolator; - - // if the translation id exists, we can just interpolate it - if (table && Object.prototype.hasOwnProperty.call(table, translationId) && table[translationId] !== null) { - var translation = table[translationId]; - - // If using link, rerun $translate with linked translationId and return it - if (translation.substr(0, 2) === '@:') { - - $translate(translation.substr(2), interpolateParams, interpolationId, defaultTranslationText, uses) - .then(deferred.resolve, deferred.reject); - } else { - // - var resolvedTranslation = Interpolator.interpolate(translation, interpolateParams, 'service', sanitizeStrategy, translationId); - resolvedTranslation = applyPostProcessing(translationId, translation, resolvedTranslation, interpolateParams, uses); - deferred.resolve(resolvedTranslation); - } - } else { - var missingTranslationHandlerTranslation; - // for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise - if ($missingTranslationHandlerFactory && !pendingLoader) { - missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, defaultTranslationText); - } - - // since we couldn't translate the inital requested translation id, - // we try it now with one or more fallback languages, if fallback language(s) is - // configured. - if (uses && $fallbackLanguage && $fallbackLanguage.length) { - fallbackTranslation(translationId, interpolateParams, Interpolator, defaultTranslationText, sanitizeStrategy) - .then(function (translation) { - deferred.resolve(translation); - }, function (_translationId) { - deferred.reject(applyNotFoundIndicators(_translationId)); - }); - } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { - // looks like the requested translation id doesn't exists. - // Now, if there is a registered handler for missing translations and no - // asyncLoader is pending, we execute the handler - if (defaultTranslationText) { - deferred.resolve(defaultTranslationText); - } else { - deferred.resolve(missingTranslationHandlerTranslation); - } - } else { - if (defaultTranslationText) { - deferred.resolve(defaultTranslationText); - } else { - deferred.reject(applyNotFoundIndicators(translationId)); - } - } - } - return deferred.promise; - }; - - var determineTranslationInstant = function (translationId, interpolateParams, interpolationId, uses, sanitizeStrategy) { - - var result, table = uses ? $translationTable[uses] : $translationTable, - Interpolator = defaultInterpolator; - - // if the interpolation id exists use custom interpolator - if (interpolatorHashMap && Object.prototype.hasOwnProperty.call(interpolatorHashMap, interpolationId)) { - Interpolator = interpolatorHashMap[interpolationId]; - } - - // if the translation id exists, we can just interpolate it - if (table && Object.prototype.hasOwnProperty.call(table, translationId) && table[translationId] !== null) { - var translation = table[translationId]; - - // If using link, rerun $translate with linked translationId and return it - if (translation.substr(0, 2) === '@:') { - result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId, uses, sanitizeStrategy); - } else { - result = Interpolator.interpolate(translation, interpolateParams, 'filter', sanitizeStrategy, translationId); - result = applyPostProcessing(translationId, translation, result, interpolateParams, uses, sanitizeStrategy); - } - } else { - var missingTranslationHandlerTranslation; - // for logging purposes only (as in $translateMissingTranslationHandlerLog), value is not returned to promise - if ($missingTranslationHandlerFactory && !pendingLoader) { - missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, sanitizeStrategy); - } - - // since we couldn't translate the inital requested translation id, - // we try it now with one or more fallback languages, if fallback language(s) is - // configured. - if (uses && $fallbackLanguage && $fallbackLanguage.length) { - fallbackIndex = 0; - result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator, sanitizeStrategy); - } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { - // looks like the requested translation id doesn't exists. - // Now, if there is a registered handler for missing translations and no - // asyncLoader is pending, we execute the handler - result = missingTranslationHandlerTranslation; - } else { - result = applyNotFoundIndicators(translationId); - } - } - - return result; - }; - - var clearNextLangAndPromise = function (key) { - if ($nextLang === key) { - $nextLang = undefined; - } - langPromises[key] = undefined; - }; - - var applyPostProcessing = function (translationId, translation, resolvedTranslation, interpolateParams, uses, sanitizeStrategy) { - var fn = postProcessFn; - - if (fn) { - - if (typeof(fn) === 'string') { - // getting on-demand instance - fn = $injector.get(fn); - } - if (fn) { - return fn(translationId, translation, resolvedTranslation, interpolateParams, uses, sanitizeStrategy); - } - } - - return resolvedTranslation; - }; - - var loadTranslationsIfMissing = function (key) { - if (!$translationTable[key] && $loaderFactory && !langPromises[key]) { - langPromises[key] = loadAsync(key).then(function (translation) { - translations(translation.key, translation.table); - return translation; - }); - } - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#preferredLanguage - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the language key for the preferred language. - * - * @param {string} langKey language String or Array to be used as preferredLanguage (changing at runtime) - * - * @return {string} preferred language key - */ - $translate.preferredLanguage = function (langKey) { - if (langKey) { - setupPreferredLanguage(langKey); - } - return $preferredLanguage; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#cloakClassName - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the configured class name for `translate-cloak` directive. - * - * @return {string} cloakClassName - */ - $translate.cloakClassName = function () { - return $cloakClassName; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#nestedObjectDelimeter - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the configured delimiter for nested namespaces. - * - * @return {string} nestedObjectDelimeter - */ - $translate.nestedObjectDelimeter = function () { - return $nestedObjectDelimeter; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#fallbackLanguage - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the language key for the fallback languages or sets a new fallback stack. - * - * @param {string=} langKey language String or Array of fallback languages to be used (to change stack at runtime) - * - * @return {string||array} fallback language key - */ - $translate.fallbackLanguage = function (langKey) { - if (langKey !== undefined && langKey !== null) { - fallbackStack(langKey); - - // as we might have an async loader initiated and a new translation language might have been defined - // we need to add the promise to the stack also. So - iterate. - if ($loaderFactory) { - if ($fallbackLanguage && $fallbackLanguage.length) { - for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { - if (!langPromises[$fallbackLanguage[i]]) { - langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]); - } - } - } - } - $translate.use($translate.use()); - } - if ($fallbackWasString) { - return $fallbackLanguage[0]; - } else { - return $fallbackLanguage; - } - - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#useFallbackLanguage - * @methodOf pascalprecht.translate.$translate - * - * @description - * Sets the first key of the fallback language stack to be used for translation. - * Therefore all languages in the fallback array BEFORE this key will be skipped! - * - * @param {string=} langKey Contains the langKey the iteration shall start with. Set to false if you want to - * get back to the whole stack - */ - $translate.useFallbackLanguage = function (langKey) { - if (langKey !== undefined && langKey !== null) { - if (!langKey) { - startFallbackIteration = 0; - } else { - var langKeyPosition = indexOf($fallbackLanguage, langKey); - if (langKeyPosition > -1) { - startFallbackIteration = langKeyPosition; - } - } - - } - - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#proposedLanguage - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the language key of language that is currently loaded asynchronously. - * - * @return {string} language key - */ - $translate.proposedLanguage = function () { - return $nextLang; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#storage - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns registered storage. - * - * @return {object} Storage - */ - $translate.storage = function () { - return Storage; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#negotiateLocale - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns a language key based on available languages and language aliases. If a - * language key cannot be resolved, returns undefined. - * - * If no or a falsy key is given, returns undefined. - * - * @param {string} [key] Language key - * @return {string|undefined} Language key or undefined if no language key is found. - */ - $translate.negotiateLocale = negotiateLocale; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#use - * @methodOf pascalprecht.translate.$translate - * - * @description - * Tells angular-translate which language to use by given language key. This method is - * used to change language at runtime. It also takes care of storing the language - * key in a configured store to let your app remember the choosed language. - * - * When trying to 'use' a language which isn't available it tries to load it - * asynchronously with registered loaders. - * - * Returns promise object with loaded language file data or string of the currently used language. - * - * If no or a falsy key is given it returns the currently used language key. - * The returned string will be ```undefined``` if setting up $translate hasn't finished. - * @example - * $translate.use("en_US").then(function(data){ - * $scope.text = $translate("HELLO"); - * }); - * - * @param {string} [key] Language key - * @return {object|string} Promise with loaded language data or the language key if a falsy param was given. - */ - $translate.use = function (key) { - if (!key) { - return $uses; - } - - var deferred = $q.defer(); - deferred.promise.then(null, angular.noop); // AJS "Possibly unhandled rejection" - - $rootScope.$emit('$translateChangeStart', {language : key}); - - // Try to get the aliased language key - var aliasedKey = negotiateLocale(key); - // Ensure only registered language keys will be loaded - if ($availableLanguageKeys.length > 0 && !aliasedKey) { - return $q.reject(key); - } - - if (aliasedKey) { - key = aliasedKey; - } - - // if there isn't a translation table for the language we've requested, - // we load it asynchronously - $nextLang = key; - if (($forceAsyncReloadEnabled || !$translationTable[key]) && $loaderFactory && !langPromises[key]) { - langPromises[key] = loadAsync(key).then(function (translation) { - translations(translation.key, translation.table); - deferred.resolve(translation.key); - if ($nextLang === key) { - useLanguage(translation.key); - } - return translation; - }, function (key) { - $rootScope.$emit('$translateChangeError', {language : key}); - deferred.reject(key); - $rootScope.$emit('$translateChangeEnd', {language : key}); - return $q.reject(key); - }); - langPromises[key]['finally'](function () { - clearNextLangAndPromise(key); - }).catch(angular.noop); // we don't care about errors (clearing) - } else if (langPromises[key]) { - // we are already loading this asynchronously - // resolve our new deferred when the old langPromise is resolved - langPromises[key].then(function (translation) { - if ($nextLang === translation.key) { - useLanguage(translation.key); - } - deferred.resolve(translation.key); - return translation; - }, function (key) { - // find first available fallback language if that request has failed - if (!$uses && $fallbackLanguage && $fallbackLanguage.length > 0 && $fallbackLanguage[0] !== key) { - return $translate.use($fallbackLanguage[0]).then(deferred.resolve, deferred.reject); - } else { - return deferred.reject(key); - } - }); - } else { - deferred.resolve(key); - useLanguage(key); - } - - return deferred.promise; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#resolveClientLocale - * @methodOf pascalprecht.translate.$translate - * - * @description - * This returns the current browser/client's language key. The result is processed with the configured uniform tag resolver. - * - * @returns {string} the current client/browser language key - */ - $translate.resolveClientLocale = function () { - return getLocale(); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#storageKey - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the key for the storage. - * - * @return {string} storage key - */ - $translate.storageKey = function () { - return storageKey(); - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#isPostCompilingEnabled - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns whether post compiling is enabled or not - * - * @return {bool} storage key - */ - $translate.isPostCompilingEnabled = function () { - return $postCompilingEnabled; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#isForceAsyncReloadEnabled - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns whether force async reload is enabled or not - * - * @return {boolean} forceAsyncReload value - */ - $translate.isForceAsyncReloadEnabled = function () { - return $forceAsyncReloadEnabled; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#isKeepContent - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns whether keepContent or not - * - * @return {boolean} keepContent value - */ - $translate.isKeepContent = function () { - return $keepContent; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#refresh - * @methodOf pascalprecht.translate.$translate - * - * @description - * Refreshes a translation table pointed by the given langKey. If langKey is not specified, - * the module will drop all existent translation tables and load new version of those which - * are currently in use. - * - * Refresh means that the module will drop target translation table and try to load it again. - * - * In case there are no loaders registered the refresh() method will throw an Error. - * - * If the module is able to refresh translation tables refresh() method will broadcast - * $translateRefreshStart and $translateRefreshEnd events. - * - * @example - * // this will drop all currently existent translation tables and reload those which are - * // currently in use - * $translate.refresh(); - * // this will refresh a translation table for the en_US language - * $translate.refresh('en_US'); - * - * @param {string} langKey A language key of the table, which has to be refreshed - * - * @return {promise} Promise, which will be resolved in case a translation tables refreshing - * process is finished successfully, and reject if not. - */ - $translate.refresh = function (langKey) { - if (!$loaderFactory) { - throw new Error('Couldn\'t refresh translation table, no loader registered!'); - } - - $rootScope.$emit('$translateRefreshStart', {language : langKey}); - - var deferred = $q.defer(), updatedLanguages = {}; - - //private helper - function loadNewData(languageKey) { - var promise = loadAsync(languageKey); - //update the load promise cache for this language - langPromises[languageKey] = promise; - //register a data handler for the promise - promise.then(function (data) { - //clear the cache for this language - $translationTable[languageKey] = {}; - //add the new data for this language - translations(languageKey, data.table); - //track that we updated this language - updatedLanguages[languageKey] = true; - }, - //handle rejection to appease the $q validation - angular.noop); - return promise; - } - - //set up post-processing - deferred.promise.then( - function () { - for (var key in $translationTable) { - if ($translationTable.hasOwnProperty(key)) { - //delete cache entries that were not updated - if (!(key in updatedLanguages)) { - delete $translationTable[key]; - } - } - } - if ($uses) { - useLanguage($uses); - } - }, - //handle rejection to appease the $q validation - angular.noop - ).finally( - function () { - $rootScope.$emit('$translateRefreshEnd', {language : langKey}); - } - ); - - if (!langKey) { - // if there's no language key specified we refresh ALL THE THINGS! - var languagesToReload = $fallbackLanguage && $fallbackLanguage.slice() || []; - if ($uses && languagesToReload.indexOf($uses) === -1) { - languagesToReload.push($uses); - } - $q.all(languagesToReload.map(loadNewData)).then(deferred.resolve, deferred.reject); - - } else if ($translationTable[langKey]) { - //just refresh the specified language cache - loadNewData(langKey).then(deferred.resolve, deferred.reject); - - } else { - deferred.reject(); - } - - return deferred.promise; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#instant - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns a translation instantly from the internal state of loaded translation. All rules - * regarding the current language, the preferred language of even fallback languages will be - * used except any promise handling. If a language was not found, an asynchronous loading - * will be invoked in the background. - * - * @param {string|array} translationId A token which represents a translation id - * This can be optionally an array of translation ids which - * results that the function's promise returns an object where - * each key is the translation id and the value the translation. - * @param {object} interpolateParams Params - * @param {string} interpolationId The id of the interpolation to use - * @param {string} forceLanguage A language to be used instead of the current language - * @param {string} sanitizeStrategy force sanitize strategy for this call instead of using the configured one - * - * @return {string|object} translation - */ - $translate.instant = function (translationId, interpolateParams, interpolationId, forceLanguage, sanitizeStrategy) { - - // we don't want to re-negotiate $uses - var uses = (forceLanguage && forceLanguage !== $uses) ? // we don't want to re-negotiate $uses - (negotiateLocale(forceLanguage) || forceLanguage) : $uses; - - // Detect undefined and null values to shorten the execution and prevent exceptions - if (translationId === null || angular.isUndefined(translationId)) { - return translationId; - } - - // Check forceLanguage is present - if (forceLanguage) { - loadTranslationsIfMissing(forceLanguage); - } - - // Duck detection: If the first argument is an array, a bunch of translations was requested. - // The result is an object. - if (angular.isArray(translationId)) { - var results = {}; - for (var i = 0, c = translationId.length; i < c; i++) { - results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId, forceLanguage, sanitizeStrategy); - } - return results; - } - - // We discarded unacceptable values. So we just need to verify if translationId is empty String - if (angular.isString(translationId) && translationId.length < 1) { - return translationId; - } - - // trim off any whitespace - if (translationId) { - translationId = trim.apply(translationId); - } - - var result, possibleLangKeys = []; - if ($preferredLanguage) { - possibleLangKeys.push($preferredLanguage); - } - if (uses) { - possibleLangKeys.push(uses); - } - if ($fallbackLanguage && $fallbackLanguage.length) { - possibleLangKeys = possibleLangKeys.concat($fallbackLanguage); - } - for (var j = 0, d = possibleLangKeys.length; j < d; j++) { - var possibleLangKey = possibleLangKeys[j]; - if ($translationTable[possibleLangKey]) { - if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') { - result = determineTranslationInstant(translationId, interpolateParams, interpolationId, uses, sanitizeStrategy); - } - } - if (typeof result !== 'undefined') { - break; - } - } - - if (!result && result !== '') { - if ($notFoundIndicatorLeft || $notFoundIndicatorRight) { - result = applyNotFoundIndicators(translationId); - } else { - // Return translation of default interpolator if not found anything. - result = defaultInterpolator.interpolate(translationId, interpolateParams, 'filter', sanitizeStrategy); - - // looks like the requested translation id doesn't exists. - // Now, if there is a registered handler for missing translations and no - // asyncLoader is pending, we execute the handler - var missingTranslationHandlerTranslation; - if ($missingTranslationHandlerFactory && !pendingLoader) { - missingTranslationHandlerTranslation = translateByHandler(translationId, interpolateParams, sanitizeStrategy); - } - - if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { - result = missingTranslationHandlerTranslation; - } - } - } - - return result; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#versionInfo - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the current version information for the angular-translate library - * - * @return {string} angular-translate version - */ - $translate.versionInfo = function () { - return version; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#loaderCache - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns the defined loaderCache. - * - * @return {boolean|string|object} current value of loaderCache - */ - $translate.loaderCache = function () { - return loaderCache; - }; - - // internal purpose only - $translate.directivePriority = function () { - return directivePriority; - }; - - // internal purpose only - $translate.statefulFilter = function () { - return statefulFilter; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#isReady - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns whether the service is "ready" to translate (i.e. loading 1st language). - * - * See also {@link pascalprecht.translate.$translate#methods_onReady onReady()}. - * - * @return {boolean} current value of ready - */ - $translate.isReady = function () { - return $isReady; - }; - - var $onReadyDeferred = $q.defer(); - $onReadyDeferred.promise.then(function () { - $isReady = true; - }); - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#onReady - * @methodOf pascalprecht.translate.$translate - * - * @description - * Calls the function provided or resolved the returned promise after the service is "ready" to translate (i.e. loading 1st language). - * - * See also {@link pascalprecht.translate.$translate#methods_isReady isReady()}. - * - * @param {Function=} fn Function to invoke when service is ready - * @return {object} Promise resolved when service is ready - */ - $translate.onReady = function (fn) { - var deferred = $q.defer(); - if (angular.isFunction(fn)) { - deferred.promise.then(fn); - } - if ($isReady) { - deferred.resolve(); - } else { - $onReadyDeferred.promise.then(deferred.resolve); - } - return deferred.promise; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#getAvailableLanguageKeys - * @methodOf pascalprecht.translate.$translate - * - * @description - * This function simply returns the registered language keys being defined before in the config phase - * With this, an application can use the array to provide a language selection dropdown or similar - * without any additional effort - * - * @returns {object} returns the list of possibly registered language keys and mapping or null if not defined - */ - $translate.getAvailableLanguageKeys = function () { - if ($availableLanguageKeys.length > 0) { - return $availableLanguageKeys; - } - return null; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translate#getTranslationTable - * @methodOf pascalprecht.translate.$translate - * - * @description - * Returns translation table by the given language key. - * - * Unless a language is provided it returns a translation table of the current one. - * Note: If translation dictionary is currently downloading or in progress - * it will return null. - * - * @param {string} langKey A token which represents a translation id - * - * @return {object} a copy of angular-translate $translationTable - */ - $translate.getTranslationTable = function (langKey) { - langKey = langKey || $translate.use(); - if (langKey && $translationTable[langKey]) { - return angular.copy($translationTable[langKey]); - } - return null; - }; - - // Whenever $translateReady is being fired, this will ensure the state of $isReady - var globalOnReadyListener = $rootScope.$on('$translateReady', function () { - $onReadyDeferred.resolve(); - globalOnReadyListener(); // one time only - globalOnReadyListener = null; - }); - var globalOnChangeListener = $rootScope.$on('$translateChangeEnd', function () { - $onReadyDeferred.resolve(); - globalOnChangeListener(); // one time only - globalOnChangeListener = null; - }); - - if ($loaderFactory) { - - // If at least one async loader is defined and there are no - // (default) translations available we should try to load them. - if (angular.equals($translationTable, {})) { - if ($translate.use()) { - $translate.use($translate.use()); - } - } - - // Also, if there are any fallback language registered, we start - // loading them asynchronously as soon as we can. - if ($fallbackLanguage && $fallbackLanguage.length) { - var processAsyncResult = function (translation) { - translations(translation.key, translation.table); - $rootScope.$emit('$translateChangeEnd', {language : translation.key}); - return translation; - }; - for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { - var fallbackLanguageId = $fallbackLanguage[i]; - if ($forceAsyncReloadEnabled || !$translationTable[fallbackLanguageId]) { - langPromises[fallbackLanguageId] = loadAsync(fallbackLanguageId).then(processAsyncResult); - } - } - } - } else { - $rootScope.$emit('$translateReady', {language : $translate.use()}); - } - - return $translate; - }]; -} - -$translate.displayName = 'displayName'; - -/** - * @ngdoc object - * @name pascalprecht.translate.$translateDefaultInterpolation - * @requires $interpolate - * - * @description - * Uses angular's `$interpolate` services to interpolate strings against some values. - * - * Be aware to configure a proper sanitization strategy. - * - * See also: - * * {@link pascalprecht.translate.$translateSanitization} - * - * @return {object} $translateDefaultInterpolation Interpolator service - */ -angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', $translateDefaultInterpolation); - -function $translateDefaultInterpolation ($interpolate, $translateSanitization) { - - 'use strict'; - - var $translateInterpolator = {}, - $locale, - $identifier = 'default'; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateDefaultInterpolation#setLocale - * @methodOf pascalprecht.translate.$translateDefaultInterpolation - * - * @description - * Sets current locale (this is currently not use in this interpolation). - * - * @param {string} locale Language key or locale. - */ - $translateInterpolator.setLocale = function (locale) { - $locale = locale; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateDefaultInterpolation#getInterpolationIdentifier - * @methodOf pascalprecht.translate.$translateDefaultInterpolation - * - * @description - * Returns an identifier for this interpolation service. - * - * @returns {string} $identifier - */ - $translateInterpolator.getInterpolationIdentifier = function () { - return $identifier; - }; - - /** - * @deprecated will be removed in 3.0 - * @see {@link pascalprecht.translate.$translateSanitization} - */ - $translateInterpolator.useSanitizeValueStrategy = function (value) { - $translateSanitization.useStrategy(value); - return this; - }; - - /** - * @ngdoc function - * @name pascalprecht.translate.$translateDefaultInterpolation#interpolate - * @methodOf pascalprecht.translate.$translateDefaultInterpolation - * - * @description - * Interpolates given value agains given interpolate params using angulars - * `$interpolate` service. - * - * Since AngularJS 1.5, `value` must not be a string but can be anything input. - * - * @param {string} value translation - * @param {object} interpolationParams interpolation params - * @param {string} context current context (filter, directive, service) - * @param {string} sanitizeStrategy sanitize strategy - * @param {string} translationId current translationId - * - * @returns {string} interpolated string - */ - $translateInterpolator.interpolate = function (value, interpolationParams, context, sanitizeStrategy, translationId) { // jshint ignore:line - interpolationParams = interpolationParams || {}; - interpolationParams = $translateSanitization.sanitize(interpolationParams, 'params', sanitizeStrategy, context); - - var interpolatedText; - if (angular.isNumber(value)) { - // numbers are safe - interpolatedText = '' + value; - } else if (angular.isString(value)) { - // strings must be interpolated (that's the job here) - interpolatedText = $interpolate(value)(interpolationParams); - interpolatedText = $translateSanitization.sanitize(interpolatedText, 'text', sanitizeStrategy, context); - } else { - // neither a number or a string, cant interpolate => empty string - interpolatedText = ''; - } - - return interpolatedText; - }; - - return $translateInterpolator; -} - -$translateDefaultInterpolation.displayName = '$translateDefaultInterpolation'; - -angular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY'); - -angular.module('pascalprecht.translate') -/** - * @ngdoc directive - * @name pascalprecht.translate.directive:translate - * @requires $interpolate, - * @requires $compile, - * @requires $parse, - * @requires $rootScope - * @restrict AE - * - * @description - * Translates given translation id either through attribute or DOM content. - * Internally it uses $translate service to translate the translation id. It possible to - * pass an optional `translate-values` object literal as string into translation id. - * - * @param {string=} translate Translation id which could be either string or interpolated string. - * @param {string=} translate-values Values to pass into translation id. Can be passed as object literal string or interpolated object. - * @param {string=} translate-attr-ATTR translate Translation id and put it into ATTR attribute. - * @param {string=} translate-default will be used unless translation was successful - * @param {boolean=} translate-compile (default true if present) defines locally activation of {@link pascalprecht.translate.$translateProvider#methods_usePostCompiling} - * @param {boolean=} translate-keep-content (default true if present) defines that in case a KEY could not be translated, that the existing content is left in the innerHTML} - * - * @example - - -
    - -
    
    -        
    TRANSLATION_ID
    -
    
    -        
    
    -        
    {{translationId}}
    -
    
    -        
    WITH_VALUES
    -
    
    -        
    WITH_VALUES
    -
    
    -        
    
    -
    -      
    -
    - - angular.module('ngView', ['pascalprecht.translate']) - - .config(function ($translateProvider) { - - $translateProvider.translations('en',{ - 'TRANSLATION_ID': 'Hello there!', - 'WITH_VALUES': 'The following value is dynamic: {{value}}', - 'WITH_CAMEL_CASE_KEY': 'The interpolation key is camel cased: {{camelCaseKey}}' - }).preferredLanguage('en'); - - }); - - angular.module('ngView').controller('TranslateCtrl', function ($scope) { - $scope.translationId = 'TRANSLATION_ID'; - - $scope.values = { - value: 78 - }; - }); - - - it('should translate', function () { - inject(function ($rootScope, $compile) { - $rootScope.translationId = 'TRANSLATION_ID'; - - element = $compile('

    ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toBe('Hello there!'); - - element = $compile('

    ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toBe('Hello there!'); - - element = $compile('

    TRANSLATION_ID

    ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toBe('Hello there!'); - - element = $compile('

    {{translationId}}

    ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toBe('Hello there!'); - - element = $compile('

    ')($rootScope); - $rootScope.$digest(); - expect(element.attr('title')).toBe('Hello there!'); - - element = $compile('

    ')($rootScope); - $rootScope.$digest(); - expect(element.text()).toBe('The interpolation key is camel cased: Hello'); - }); - }); -
    -
    - */ -.directive('translate', translateDirective); -function translateDirective($translate, $interpolate, $compile, $parse, $rootScope) { - - 'use strict'; - - /** - * @name trim - * @private - * - * @description - * trim polyfill - * - * @returns {string} The string stripped of whitespace from both ends - */ - var trim = function() { - return this.toString().replace(/^\s+|\s+$/g, ''); - }; - - return { - restrict: 'AE', - scope: true, - priority: $translate.directivePriority(), - compile: function (tElement, tAttr) { - - var translateValuesExist = (tAttr.translateValues) ? - tAttr.translateValues : undefined; - - var translateInterpolation = (tAttr.translateInterpolation) ? - tAttr.translateInterpolation : undefined; - - var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i); - - var interpolateRegExp = '^(.*)(' + $interpolate.startSymbol() + '.*' + $interpolate.endSymbol() + ')(.*)', - watcherRegExp = '^(.*)' + $interpolate.startSymbol() + '(.*)' + $interpolate.endSymbol() + '(.*)'; - - return function linkFn(scope, iElement, iAttr) { - - scope.interpolateParams = {}; - scope.preText = ''; - scope.postText = ''; - scope.translateNamespace = getTranslateNamespace(scope); - var translationIds = {}; - - var initInterpolationParams = function (interpolateParams, iAttr, tAttr) { - // initial setup - if (iAttr.translateValues) { - angular.extend(interpolateParams, $parse(iAttr.translateValues)(scope.$parent)); - } - // initially fetch all attributes if existing and fill the params - if (translateValueExist) { - for (var attr in tAttr) { - if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') { - var attributeName = angular.lowercase(attr.substr(14, 1)) + attr.substr(15); - interpolateParams[attributeName] = tAttr[attr]; - } - } - } - }; - - // Ensures any change of the attribute "translate" containing the id will - // be re-stored to the scope's "translationId". - // If the attribute has no content, the element's text value (white spaces trimmed off) will be used. - var observeElementTranslation = function (translationId) { - - // Remove any old watcher - if (angular.isFunction(observeElementTranslation._unwatchOld)) { - observeElementTranslation._unwatchOld(); - observeElementTranslation._unwatchOld = undefined; - } - - if (angular.equals(translationId , '') || !angular.isDefined(translationId)) { - var iElementText = trim.apply(iElement.text()); - - // Resolve translation id by inner html if required - var interpolateMatches = iElementText.match(interpolateRegExp); - // Interpolate translation id if required - if (angular.isArray(interpolateMatches)) { - scope.preText = interpolateMatches[1]; - scope.postText = interpolateMatches[3]; - translationIds.translate = $interpolate(interpolateMatches[2])(scope.$parent); - var watcherMatches = iElementText.match(watcherRegExp); - if (angular.isArray(watcherMatches) && watcherMatches[2] && watcherMatches[2].length) { - observeElementTranslation._unwatchOld = scope.$watch(watcherMatches[2], function (newValue) { - translationIds.translate = newValue; - updateTranslations(); - }); - } - } else { - // do not assigne the translation id if it is empty. - translationIds.translate = !iElementText ? undefined : iElementText; - } - } else { - translationIds.translate = translationId; - } - updateTranslations(); - }; - - var observeAttributeTranslation = function (translateAttr) { - iAttr.$observe(translateAttr, function (translationId) { - translationIds[translateAttr] = translationId; - updateTranslations(); - }); - }; - - // initial setup with values - initInterpolationParams(scope.interpolateParams, iAttr, tAttr); - - var firstAttributeChangedEvent = true; - iAttr.$observe('translate', function (translationId) { - if (typeof translationId === 'undefined') { - // case of element "xyz" - observeElementTranslation(''); - } else { - // case of regular attribute - if (translationId !== '' || !firstAttributeChangedEvent) { - translationIds.translate = translationId; - updateTranslations(); - } - } - firstAttributeChangedEvent = false; - }); - - for (var translateAttr in iAttr) { - if (iAttr.hasOwnProperty(translateAttr) && translateAttr.substr(0, 13) === 'translateAttr' && translateAttr.length > 13) { - observeAttributeTranslation(translateAttr); - } - } - - iAttr.$observe('translateDefault', function (value) { - scope.defaultText = value; - updateTranslations(); - }); - - if (translateValuesExist) { - iAttr.$observe('translateValues', function (interpolateParams) { - if (interpolateParams) { - scope.$parent.$watch(function () { - angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent)); - }); - } - }); - } - - if (translateValueExist) { - var observeValueAttribute = function (attrName) { - iAttr.$observe(attrName, function (value) { - var attributeName = angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15); - scope.interpolateParams[attributeName] = value; - }); - }; - for (var attr in iAttr) { - if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') { - observeValueAttribute(attr); - } - } - } - - // Master update function - var updateTranslations = function () { - for (var key in translationIds) { - if (translationIds.hasOwnProperty(key) && translationIds[key] !== undefined) { - updateTranslation(key, translationIds[key], scope, scope.interpolateParams, scope.defaultText, scope.translateNamespace); - } - } - }; - - // Put translation processing function outside loop - var updateTranslation = function(translateAttr, translationId, scope, interpolateParams, defaultTranslationText, translateNamespace) { - if (translationId) { - // if translation id starts with '.' and translateNamespace given, prepend namespace - if (translateNamespace && translationId.charAt(0) === '.') { - translationId = translateNamespace + translationId; - } - - $translate(translationId, interpolateParams, translateInterpolation, defaultTranslationText, scope.translateLanguage) - .then(function (translation) { - applyTranslation(translation, scope, true, translateAttr); - }, function (translationId) { - applyTranslation(translationId, scope, false, translateAttr); - }); - } else { - // as an empty string cannot be translated, we can solve this using successful=false - applyTranslation(translationId, scope, false, translateAttr); - } - }; - - var applyTranslation = function (value, scope, successful, translateAttr) { - if (!successful) { - if (typeof scope.defaultText !== 'undefined') { - value = scope.defaultText; - } - } - if (translateAttr === 'translate') { - // default translate into innerHTML - if (successful || (!successful && !$translate.isKeepContent() && typeof iAttr.translateKeepContent === 'undefined')) { - iElement.empty().append(scope.preText + value + scope.postText); - } - var globallyEnabled = $translate.isPostCompilingEnabled(); - var locallyDefined = typeof tAttr.translateCompile !== 'undefined'; - var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false'; - if ((globallyEnabled && !locallyDefined) || locallyEnabled) { - $compile(iElement.contents())(scope); - } - } else { - // translate attribute - var attributeName = iAttr.$attr[translateAttr]; - if (attributeName.substr(0, 5) === 'data-') { - // ensure html5 data prefix is stripped - attributeName = attributeName.substr(5); - } - attributeName = attributeName.substr(15); - iElement.attr(attributeName, value); - } - }; - - if (translateValuesExist || translateValueExist || iAttr.translateDefault) { - scope.$watch('interpolateParams', updateTranslations, true); - } - - // Replaced watcher on translateLanguage with event listener - scope.$on('translateLanguageChanged', updateTranslations); - - // Ensures the text will be refreshed after the current language was changed - // w/ $translate.use(...) - var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslations); - - // ensure translation will be looked up at least one - if (iElement.text().length) { - if (iAttr.translate) { - observeElementTranslation(iAttr.translate); - } else { - observeElementTranslation(''); - } - } else if (iAttr.translate) { - // ensure attribute will be not skipped - observeElementTranslation(iAttr.translate); - } - updateTranslations(); - scope.$on('$destroy', unbind); - }; - } - }; -} - -/** - * Returns the scope's namespace. - * @private - * @param scope - * @returns {string} - */ -function getTranslateNamespace(scope) { - 'use strict'; - if (scope.translateNamespace) { - return scope.translateNamespace; - } - if (scope.$parent) { - return getTranslateNamespace(scope.$parent); - } -} - -translateDirective.displayName = 'translateDirective'; - -angular.module('pascalprecht.translate') -/** - * @ngdoc directive - * @name pascalprecht.translate.directive:translate-attr - * @restrict A - * - * @description - * Translates attributes like translate-attr-ATTR, but with an object like ng-class. - * Internally it uses `translate` service to translate translation id. It possible to - * pass an optional `translate-values` object literal as string into translation id. - * - * @param {string=} translate-attr Object literal mapping attributes to translation ids. - * @param {string=} translate-values Values to pass into the translation ids. Can be passed as object literal string. - * - * @example - - -
    - - - -
    -
    - - angular.module('ngView', ['pascalprecht.translate']) - - .config(function ($translateProvider) { - - $translateProvider.translations('en',{ - 'TRANSLATION_ID': 'Hello there!', - 'WITH_VALUES': 'The following value is dynamic: {{value}}', - }).preferredLanguage('en'); - - }); - - angular.module('ngView').controller('TranslateCtrl', function ($scope) { - $scope.translationId = 'TRANSLATION_ID'; - - $scope.values = { - value: 78 - }; - }); - - - it('should translate', function () { - inject(function ($rootScope, $compile) { - $rootScope.translationId = 'TRANSLATION_ID'; - - element = $compile('')($rootScope); - $rootScope.$digest(); - expect(element.attr('placeholder)).toBe('Hello there!'); - expect(element.attr('title)).toBe('The following value is dynamic: 5'); - }); - }); - -
    - */ -.directive('translateAttr', translateAttrDirective); -function translateAttrDirective($translate, $rootScope) { - - 'use strict'; - - return { - restrict: 'A', - priority: $translate.directivePriority(), - link: function linkFn(scope, element, attr) { - - var translateAttr, - translateValues, - previousAttributes = {}; - - // Main update translations function - var updateTranslations = function () { - angular.forEach(translateAttr, function (translationId, attributeName) { - if (!translationId) { - return; - } - previousAttributes[attributeName] = true; - - // if translation id starts with '.' and translateNamespace given, prepend namespace - if (scope.translateNamespace && translationId.charAt(0) === '.') { - translationId = scope.translateNamespace + translationId; - } - $translate(translationId, translateValues, attr.translateInterpolation, undefined, scope.translateLanguage) - .then(function (translation) { - element.attr(attributeName, translation); - }, function (translationId) { - element.attr(attributeName, translationId); - }); - }); - - // Removing unused attributes that were previously used - angular.forEach(previousAttributes, function (flag, attributeName) { - if (!translateAttr[attributeName]) { - element.removeAttr(attributeName); - delete previousAttributes[attributeName]; - } - }); - }; - - // Watch for attribute changes - watchAttribute( - scope, - attr.translateAttr, - function (newValue) { translateAttr = newValue; }, - updateTranslations - ); - // Watch for value changes - watchAttribute( - scope, - attr.translateValues, - function (newValue) { translateValues = newValue; }, - updateTranslations - ); - - if (attr.translateValues) { - scope.$watch(attr.translateValues, updateTranslations, true); - } - - // Replaced watcher on translateLanguage with event listener - scope.$on('translateLanguageChanged', updateTranslations); - - // Ensures the text will be refreshed after the current language was changed - // w/ $translate.use(...) - var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslations); - - updateTranslations(); - scope.$on('$destroy', unbind); - } - }; -} - -function watchAttribute(scope, attribute, valueCallback, changeCallback) { - 'use strict'; - if (!attribute) { - return; - } - if (attribute.substr(0, 2) === '::') { - attribute = attribute.substr(2); - } else { - scope.$watch(attribute, function(newValue) { - valueCallback(newValue); - changeCallback(); - }, true); - } - valueCallback(scope.$eval(attribute)); -} - -translateAttrDirective.displayName = 'translateAttrDirective'; - -angular.module('pascalprecht.translate') -/** - * @ngdoc directive - * @name pascalprecht.translate.directive:translateCloak - * @requires $translate - * @restrict A - * - * $description - * Adds a `translate-cloak` class name to the given element where this directive - * is applied initially and removes it, once a loader has finished loading. - * - * This directive can be used to prevent initial flickering when loading translation - * data asynchronously. - * - * The class name is defined in - * {@link pascalprecht.translate.$translateProvider#cloakClassName $translate.cloakClassName()}. - * - * @param {string=} translate-cloak If a translationId is provided, it will be used for showing - * or hiding the cloak. Basically it relies on the translation - * resolve. - */ -.directive('translateCloak', translateCloakDirective); - -function translateCloakDirective($translate, $rootScope) { - - 'use strict'; - - return { - compile : function (tElement) { - var applyCloak = function (element) { - element.addClass($translate.cloakClassName()); - }, - removeCloak = function (element) { - element.removeClass($translate.cloakClassName()); - }; - applyCloak(tElement); - - return function linkFn(scope, iElement, iAttr) { - //Create bound functions that incorporate the active DOM element. - var iRemoveCloak = removeCloak.bind(this, iElement), iApplyCloak = applyCloak.bind(this, iElement); - if (iAttr.translateCloak && iAttr.translateCloak.length) { - // Register a watcher for the defined translation allowing a fine tuned cloak - iAttr.$observe('translateCloak', function (translationId) { - $translate(translationId).then(iRemoveCloak, iApplyCloak); - }); - $rootScope.$on('$translateChangeSuccess', function () { - $translate(iAttr.translateCloak).then(iRemoveCloak, iApplyCloak); - }); - } else { - $translate.onReady(iRemoveCloak); - } - }; - } - }; -} - -translateCloakDirective.displayName = 'translateCloakDirective'; - -angular.module('pascalprecht.translate') -/** - * @ngdoc directive - * @name pascalprecht.translate.directive:translateNamespace - * @restrict A - * - * @description - * Translates given translation id either through attribute or DOM content. - * Internally it uses `translate` filter to translate translation id. It possible to - * pass an optional `translate-values` object literal as string into translation id. - * - * @param {string=} translate namespace name which could be either string or interpolated string. - * - * @example - - -
    - -
    -

    .HEADERS.TITLE

    -

    .HEADERS.WELCOME

    -
    - -
    -

    .TITLE

    -

    .WELCOME

    -
    - -
    -
    - - angular.module('ngView', ['pascalprecht.translate']) - - .config(function ($translateProvider) { - - $translateProvider.translations('en',{ - 'TRANSLATION_ID': 'Hello there!', - 'CONTENT': { - 'HEADERS': { - TITLE: 'Title' - } - }, - 'CONTENT.HEADERS.WELCOME': 'Welcome' - }).preferredLanguage('en'); - - }); - - -
    - */ -.directive('translateNamespace', translateNamespaceDirective); - -function translateNamespaceDirective() { - - 'use strict'; - - return { - restrict: 'A', - scope: true, - compile: function () { - return { - pre: function (scope, iElement, iAttrs) { - scope.translateNamespace = getTranslateNamespace(scope); - - if (scope.translateNamespace && iAttrs.translateNamespace.charAt(0) === '.') { - scope.translateNamespace += iAttrs.translateNamespace; - } else { - scope.translateNamespace = iAttrs.translateNamespace; - } - } - }; - } - }; -} - -/** - * Returns the scope's namespace. - * @private - * @param scope - * @returns {string} - */ -function getTranslateNamespace(scope) { - 'use strict'; - if (scope.translateNamespace) { - return scope.translateNamespace; - } - if (scope.$parent) { - return getTranslateNamespace(scope.$parent); - } -} - -translateNamespaceDirective.displayName = 'translateNamespaceDirective'; - -angular.module('pascalprecht.translate') -/** - * @ngdoc directive - * @name pascalprecht.translate.directive:translateLanguage - * @restrict A - * - * @description - * Forces the language to the directives in the underlying scope. - * - * @param {string=} translate language that will be negotiated. - * - * @example - - -
    - -
    -

    HELLO

    -
    - -
    -

    HELLO

    -
    - -
    -
    - - angular.module('ngView', ['pascalprecht.translate']) - - .config(function ($translateProvider) { - - $translateProvider - .translations('en',{ - 'HELLO': 'Hello world!' - }) - .translations('de',{ - 'HELLO': 'Hallo Welt!' - }) - .preferredLanguage('en'); - - }); - - -
    - */ -.directive('translateLanguage', translateLanguageDirective); - -function translateLanguageDirective() { - - 'use strict'; - - return { - restrict: 'A', - scope: true, - compile: function () { - return function linkFn(scope, iElement, iAttrs) { - - iAttrs.$observe('translateLanguage', function (newTranslateLanguage) { - scope.translateLanguage = newTranslateLanguage; - }); - - scope.$watch('translateLanguage', function(){ - scope.$broadcast('translateLanguageChanged'); - }); - }; - } - }; -} - -translateLanguageDirective.displayName = 'translateLanguageDirective'; - -angular.module('pascalprecht.translate') -/** - * @ngdoc filter - * @name pascalprecht.translate.filter:translate - * @requires $parse - * @requires pascalprecht.translate.$translate - * @function - * - * @description - * Uses `$translate` service to translate contents. Accepts interpolate parameters - * to pass dynamized values though translation. - * - * @param {string} translationId A translation id to be translated. - * @param {*=} interpolateParams Optional object literal (as hash or string) to pass values into translation. - * - * @returns {string} Translated text. - * - * @example - - -
    - -
    {{ 'TRANSLATION_ID' | translate }}
    -
    {{ translationId | translate }}
    -
    {{ 'WITH_VALUES' | translate:'{value: 5}' }}
    -
    {{ 'WITH_VALUES' | translate:values }}
    - -
    -
    - - angular.module('ngView', ['pascalprecht.translate']) - - .config(function ($translateProvider) { - - $translateProvider.translations('en', { - 'TRANSLATION_ID': 'Hello there!', - 'WITH_VALUES': 'The following value is dynamic: {{value}}' - }); - $translateProvider.preferredLanguage('en'); - - }); - - angular.module('ngView').controller('TranslateCtrl', function ($scope) { - $scope.translationId = 'TRANSLATION_ID'; - - $scope.values = { - value: 78 - }; - }); - -
    - */ -.filter('translate', translateFilterFactory); - -function translateFilterFactory($parse, $translate) { - - 'use strict'; - - var translateFilter = function (translationId, interpolateParams, interpolation, forceLanguage) { - if (!angular.isObject(interpolateParams)) { - var ctx = this || { - '__SCOPE_IS_NOT_AVAILABLE': 'More info at https://github.com/angular/angular.js/commit/8863b9d04c722b278fa93c5d66ad1e578ad6eb1f' - }; - interpolateParams = $parse(interpolateParams)(ctx); - } - - return $translate.instant(translationId, interpolateParams, interpolation, forceLanguage); - }; - - if ($translate.statefulFilter()) { - translateFilter.$stateful = true; - } - - return translateFilter; -} - -translateFilterFactory.displayName = 'translateFilterFactory'; - -angular.module('pascalprecht.translate') - -/** - * @ngdoc object - * @name pascalprecht.translate.$translationCache - * @requires $cacheFactory - * - * @description - * The first time a translation table is used, it is loaded in the translation cache for quick retrieval. You - * can load translation tables directly into the cache by consuming the - * `$translationCache` service directly. - * - * @return {object} $cacheFactory object. - */ - .factory('$translationCache', $translationCache); - -function $translationCache($cacheFactory) { - - 'use strict'; - - return $cacheFactory('translations'); -} - -$translationCache.displayName = '$translationCache'; -return 'pascalprecht.translate'; - -})); diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate_2.15.1/angular-translate.min.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate_2.15.1/angular-translate.min.js deleted file mode 100644 index 8549ef9e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular-translate_2.15.1/angular-translate.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * angular-translate - v2.15.1 - 2017-03-04 - * - * Copyright (c) 2017 The angular-translate team, Pascal Precht; Licensed MIT - */ -!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){function a(a){"use strict";var b=a.storageKey(),c=a.storage(),d=function(){var d=a.preferredLanguage();angular.isString(d)?a.use(d):c.put(b,a.use())};d.displayName="fallbackFromIncorrectStorageValue",c?c.get(b)?a.use(c.get(b)).catch(d):d():angular.isString(a.preferredLanguage())&&a.use(a.preferredLanguage())}function b(){"use strict";var a,b,c,d=null,e=!1,f=!1;c={sanitize:function(a,b){return"text"===b&&(a=h(a)),a},escape:function(a,b){return"text"===b&&(a=g(a)),a},sanitizeParameters:function(a,b){return"params"===b&&(a=j(a,h)),a},escapeParameters:function(a,b){return"params"===b&&(a=j(a,g)),a},sce:function(a,b,c){return"text"===b?a=i(a):"params"===b&&"filter"!==c&&(a=j(a,g)),a},sceParameters:function(a,b){return"params"===b&&(a=j(a,i)),a}},c.escaped=c.escapeParameters,this.addStrategy=function(a,b){return c[a]=b,this},this.removeStrategy=function(a){return delete c[a],this},this.useStrategy=function(a){return e=!0,d=a,this},this.$get=["$injector","$log",function(g,h){var i={},j=function(a,b,d,e){return angular.forEach(e,function(e){if(angular.isFunction(e))a=e(a,b,d);else if(angular.isFunction(c[e]))a=c[e](a,b,d);else{if(!angular.isString(c[e]))throw new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+e+"'");if(!i[c[e]])try{i[c[e]]=g.get(c[e])}catch(a){throw i[c[e]]=function(){},new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+e+"'")}a=i[c[e]](a,b,d)}}),a},k=function(){e||f||(h.warn("pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details."),f=!0)};return g.has("$sanitize")&&(a=g.get("$sanitize")),g.has("$sce")&&(b=g.get("$sce")),{useStrategy:function(a){return function(b){a.useStrategy(b)}}(this),sanitize:function(a,b,c,e){if(d||k(),c||null===c||(c=d),!c)return a;e||(e="service");var f=angular.isArray(c)?c:[c];return j(a,b,e,f)}}}];var g=function(a){var b=angular.element("
    ");return b.text(a),b.html()},h=function(b){if(!a)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as 'escape'.");return a(b)},i=function(a){if(!b)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot find $sce service.");return b.trustAsHtml(a)},j=function(a,b,c){if(angular.isDate(a))return a;if(angular.isObject(a)){var d=angular.isArray(a)?[]:{};if(c){if(c.indexOf(a)>-1)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot interpolate parameter due recursive object")}else c=[];return c.push(a),angular.forEach(a,function(a,e){angular.isFunction(a)||(d[e]=j(a,b,c))}),c.splice(-1,1),d}return angular.isNumber(a)?a:angular.isUndefined(a)||null===a?a:b(a)}}function c(a,b,c,d){"use strict";var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u={},v=[],w=a,x=[],y="translate-cloak",z=!1,A=!1,B=".",C=!1,D=!1,E=0,F=!0,G="default",H={default:function(a){return(a||"").split("-").join("_")},java:function(a){var b=(a||"").split("-").join("_"),c=b.split("_");return c.length>1?c[0].toLowerCase()+"_"+c[1].toUpperCase():b},bcp47:function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c.length>1?c[0].toLowerCase()+"-"+c[1].toUpperCase():b},"iso639-1":function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c[0].toLowerCase()}},I="2.15.1",J=function(){if(angular.isFunction(d.getLocale))return d.getLocale();var a,c,e=b.$get().navigator,f=["language","browserLanguage","systemLanguage","userLanguage"];if(angular.isArray(e.languages))for(a=0;a-1)return a;if(f){var g;for(var h in f)if(f.hasOwnProperty(h)){var i=!1,j=Object.prototype.hasOwnProperty.call(f,h)&&angular.lowercase(h)===angular.lowercase(a);if("*"===h.slice(-1)&&(i=h.slice(0,-1)===a.slice(0,h.length-1)),(j||i)&&(g=f[h],L(b,angular.lowercase(g))>-1))return g}}var k=a.split("_");return k.length>1&&L(b,angular.lowercase(k[0]))>-1?k[0]:void 0}},O=function(a,b){if(!a&&!b)return u;if(a&&!b){if(angular.isString(a))return u[a]}else angular.isObject(u[a])||(u[a]={}),angular.extend(u[a],P(b));return this};this.translations=O,this.cloakClassName=function(a){return a?(y=a,this):y},this.nestedObjectDelimeter=function(a){return a?(B=a,this):B};var P=function(a,b,c,d){var e,f,g,h;b||(b=[]),c||(c={});for(e in a)Object.prototype.hasOwnProperty.call(a,e)&&(h=a[e],angular.isObject(h)?P(h,b.concat(e),c,e):(f=b.length?""+b.join(B)+B+e:e,b.length&&e===d&&(g=""+b.join(B),c[g]="@:"+f),c[f]=h));return c};P.displayName="flatObject",this.addInterpolation=function(a){return x.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return n=a,this},this.useSanitizeValueStrategy=function(a){return c.useStrategy(a),this},this.preferredLanguage=function(a){return a?(Q(a),this):e};var Q=function(a){return a&&(e=a),e};this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(q=a,this):q},this.translationNotFoundIndicatorRight=function(a){return a?(r=a,this):r},this.fallbackLanguage=function(a){return R(a),this};var R=function(a){return a?(angular.isString(a)?(h=!0,g=[a]):angular.isArray(a)&&(h=!1,g=a),angular.isString(e)&&L(g,e)<0&&g.push(e),this):h?g[0]:g};this.use=function(a){if(a){if(!u[a]&&!o)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return i=a,this}return i},this.resolveClientLocale=function(){return K()};var S=function(a){return a?(w=a,this):l?l+w:w};this.storageKey=S,this.useUrlLoader=function(a,b){return this.useLoader("$translateUrlLoader",angular.extend({url:a},b))},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return o=a,p=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return k=a,this},this.storagePrefix=function(a){return a?(l=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return m=a,this},this.usePostCompiling=function(a){return z=!!a,this},this.forceAsyncReload=function(a){return A=!!a,this},this.uniformLanguageTag=function(a){return a?angular.isString(a)&&(a={standard:a}):a={},G=a.standard,this},this.determinePreferredLanguage=function(a){var b=a&&angular.isFunction(a)?a():K();return e=v.length?N(b)||b:b,this},this.registerAvailableLanguageKeys=function(a,b){return a?(v=a,b&&(f=b),this):v},this.useLoaderCache=function(a){return a===!1?s=void 0:a===!0?s=!0:"undefined"==typeof a?s="$translationCache":a&&(s=a),this},this.directivePriority=function(a){return void 0===a?E:(E=a,this)},this.statefulFilter=function(a){return void 0===a?F:(F=a,this)},this.postProcess=function(a){return t=a?a:void 0,this},this.keepContent=function(a){return D=!!a,this},this.$get=["$log","$injector","$rootScope","$q",function(a,b,c,d){var f,l,G,H=b.get(n||"$translateDefaultInterpolation"),J=!1,T={},U={},V=function(a,b,c,h,j){!i&&e&&(i=e);var m=j&&j!==i?N(j)||j:i;if(j&&ka(j),angular.isArray(a)){var n=function(a){for(var e={},f=[],g=function(a){var f=d.defer(),g=function(b){e[a]=b,f.resolve([a,b])};return V(a,b,c,h,j).then(g,g),f.promise},i=0,k=a.length;i0?G:l,a,b,c,d,e)},fa=function(a,b,c,d){return da(G>0?G:l,a,b,c,d)},ga=function(a,b,c,e,f,h){var i=d.defer(),j=f?u[f]:u,k=c?T[c]:H;if(j&&Object.prototype.hasOwnProperty.call(j,a)&&null!==j[a]){var l=j[a];if("@:"===l.substr(0,2))V(l.substr(2),b,c,e,f).then(i.resolve,i.reject);else{var n=k.interpolate(l,b,"service",h,a);n=ja(a,l,n,b,f),i.resolve(n)}}else{var o;m&&!J&&(o=ba(a,b,e)),f&&g&&g.length?ea(a,b,k,e,h).then(function(a){i.resolve(a)},function(a){i.reject(W(a))}):m&&!J&&o?e?i.resolve(e):i.resolve(o):e?i.resolve(e):i.reject(W(a))}return i.promise},ha=function(a,b,c,d,e){var f,h=d?u[d]:u,i=H;if(T&&Object.prototype.hasOwnProperty.call(T,c)&&(i=T[c]),h&&Object.prototype.hasOwnProperty.call(h,a)&&null!==h[a]){var j=h[a];"@:"===j.substr(0,2)?f=ha(j.substr(2),b,c,d,e):(f=i.interpolate(j,b,"filter",e,a),f=ja(a,j,f,b,d,e))}else{var k;m&&!J&&(k=ba(a,b,e)),d&&g&&g.length?(l=0,f=fa(a,b,i,e)):f=m&&!J&&k?k:W(a)}return f},ia=function(a){j===a&&(j=void 0),U[a]=void 0},ja=function(a,c,d,e,f,g){var h=t;return h&&("string"==typeof h&&(h=b.get(h)),h)?h(a,c,d,e,f,g):d},ka=function(a){u[a]||!o||U[a]||(U[a]=Y(a).then(function(a){return O(a.key,a.table),a}))};V.preferredLanguage=function(a){return a&&Q(a),e},V.cloakClassName=function(){return y},V.nestedObjectDelimeter=function(){return B},V.fallbackLanguage=function(a){if(void 0!==a&&null!==a){if(R(a),o&&g&&g.length)for(var b=0,c=g.length;b-1&&(G=b)}else G=0},V.proposedLanguage=function(){return j},V.storage=function(){return f},V.negotiateLocale=N,V.use=function(a){if(!a)return i;var b=d.defer();b.promise.then(null,angular.noop),c.$emit("$translateChangeStart",{language:a});var e=N(a);return v.length>0&&!e?d.reject(a):(e&&(a=e),j=a,!A&&u[a]||!o||U[a]?U[a]?U[a].then(function(a){return j===a.key&&X(a.key),b.resolve(a.key),a},function(a){return!i&&g&&g.length>0&&g[0]!==a?V.use(g[0]).then(b.resolve,b.reject):b.reject(a)}):(b.resolve(a),X(a)):(U[a]=Y(a).then(function(c){return O(c.key,c.table),b.resolve(c.key),j===a&&X(c.key),c},function(a){return c.$emit("$translateChangeError",{language:a}),b.reject(a),c.$emit("$translateChangeEnd",{language:a}),d.reject(a)}),U[a].finally(function(){ia(a)}).catch(angular.noop)),b.promise)},V.resolveClientLocale=function(){return K()},V.storageKey=function(){return S()},V.isPostCompilingEnabled=function(){return z},V.isForceAsyncReloadEnabled=function(){return A},V.isKeepContent=function(){return D},V.refresh=function(a){function b(a){var b=Y(a);return U[a]=b,b.then(function(b){u[a]={},O(a,b.table),f[a]=!0},angular.noop),b}if(!o)throw new Error("Couldn't refresh translation table, no loader registered!");c.$emit("$translateRefreshStart",{language:a});var e=d.defer(),f={};if(e.promise.then(function(){for(var a in u)u.hasOwnProperty(a)&&(a in f||delete u[a]);i&&X(i)},angular.noop).finally(function(){c.$emit("$translateRefreshEnd",{language:a})}),a)u[a]?b(a).then(e.resolve,e.reject):e.reject();else{var h=g&&g.slice()||[];i&&h.indexOf(i)===-1&&h.push(i),d.all(h.map(b)).then(e.resolve,e.reject)}return e.promise},V.instant=function(a,b,c,d,f){var h=d&&d!==i?N(d)||d:i;if(null===a||angular.isUndefined(a))return a;if(d&&ka(d),angular.isArray(a)){for(var j={},k=0,l=a.length;k0?v:null},V.getTranslationTable=function(a){return a=a||V.use(),a&&u[a]?angular.copy(u[a]):null};var ma=c.$on("$translateReady",function(){la.resolve(),ma(),ma=null}),na=c.$on("$translateChangeEnd",function(){la.resolve(),na(),na=null});if(o){if(angular.equals(u,{})&&V.use()&&V.use(V.use()),g&&g.length)for(var oa=function(a){return O(a.key,a.table),c.$emit("$translateChangeEnd",{language:a.key}),a},pa=0,qa=g.length;pa13&&t(v);if(p.$observe("translateDefault",function(a){h.defaultText=a,y()}),j&&p.$observe("translateValues",function(a){a&&h.$parent.$watch(function(){angular.extend(h.interpolateParams,d(a)(h.$parent))})}),l){var w=function(a){p.$observe(a,function(b){var c=angular.lowercase(a.substr(14,1))+a.substr(15);h.interpolateParams[c]=b})};for(var x in p)Object.prototype.hasOwnProperty.call(p,x)&&"translateValue"===x.substr(0,14)&&"translateValues"!==x&&w(x)}var y=function(){for(var a in q)q.hasOwnProperty(a)&&void 0!==q[a]&&z(a,q[a],h,h.interpolateParams,h.defaultText,h.translateNamespace)},z=function(b,c,d,e,f,g){c?(g&&"."===c.charAt(0)&&(c=g+c),a(c,e,k,f,d.translateLanguage).then(function(a){A(a,d,!0,b)},function(a){A(a,d,!1,b)})):A(c,d,!1,b)},A=function(b,d,e,f){if(e||"undefined"!=typeof d.defaultText&&(b=d.defaultText),"translate"===f){(e||!e&&!a.isKeepContent()&&"undefined"==typeof p.translateKeepContent)&&o.empty().append(d.preText+b+d.postText);var g=a.isPostCompilingEnabled(),h="undefined"!=typeof i.translateCompile,j=h&&"false"!==i.translateCompile;(g&&!h||j)&&c(o.contents())(d)}else{var k=p.$attr[f];"data-"===k.substr(0,5)&&(k=k.substr(5)),k=k.substr(15),o.attr(k,b)}};(j||l||p.translateDefault)&&h.$watch("interpolateParams",y,!0),h.$on("translateLanguageChanged",y);var B=e.$on("$translateChangeSuccess",y);o.text().length?s(p.translate?p.translate:""):p.translate&&s(p.translate),y(),h.$on("$destroy",B)}}}}function f(a){"use strict";return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function g(a,b){"use strict";return{restrict:"A",priority:a.directivePriority(),link:function(c,d,e){var f,g,i={},j=function(){angular.forEach(f,function(b,f){b&&(i[f]=!0,c.translateNamespace&&"."===b.charAt(0)&&(b=c.translateNamespace+b),a(b,g,e.translateInterpolation,void 0,c.translateLanguage).then(function(a){d.attr(f,a)},function(a){d.attr(f,a)}))}),angular.forEach(i,function(a,b){f[b]||(d.removeAttr(b),delete i[b])})};h(c,e.translateAttr,function(a){f=a},j),h(c,e.translateValues,function(a){g=a},j),e.translateValues&&c.$watch(e.translateValues,j,!0),c.$on("translateLanguageChanged",j);var k=b.$on("$translateChangeSuccess",j);j(),c.$on("$destroy",k)}}}function h(a,b,c,d){"use strict";b&&("::"===b.substr(0,2)?b=b.substr(2):a.$watch(b,function(a){c(a),d()},!0),c(a.$eval(b)))}function i(a,b){"use strict";return{compile:function(c){var d=function(b){b.addClass(a.cloakClassName())},e=function(b){b.removeClass(a.cloakClassName())};return d(c),function(c,f,g){var h=e.bind(this,f),i=d.bind(this,f);g.translateCloak&&g.translateCloak.length?(g.$observe("translateCloak",function(b){a(b).then(h,i)}),b.$on("$translateChangeSuccess",function(){a(g.translateCloak).then(h,i)})):a.onReady(h)}}}}function j(){"use strict";return{restrict:"A",scope:!0,compile:function(){return{pre:function(a,b,c){a.translateNamespace=f(a),a.translateNamespace&&"."===c.translateNamespace.charAt(0)?a.translateNamespace+=c.translateNamespace:a.translateNamespace=c.translateNamespace}}}}}function f(a){"use strict";return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function k(){"use strict";return{restrict:"A",scope:!0,compile:function(){return function(a,b,c){c.$observe("translateLanguage",function(b){a.translateLanguage=b}),a.$watch("translateLanguage",function(){a.$broadcast("translateLanguageChanged")})}}}}function l(a,b){"use strict";var c=function(c,d,e,f){if(!angular.isObject(d)){var g=this||{__SCOPE_IS_NOT_AVAILABLE:"More info at https://github.com/angular/angular.js/commit/8863b9d04c722b278fa93c5d66ad1e578ad6eb1f"};d=a(d)(g)}return b.instant(c,d,e,f)};return b.statefulFilter()&&(c.$stateful=!0),c}function m(a){"use strict";return a("translations")}return a.$inject=["$translate"],c.$inject=["$STORAGE_KEY","$windowProvider","$translateSanitizationProvider","pascalprechtTranslateOverrider"],d.$inject=["$interpolate","$translateSanitization"],e.$inject=["$translate","$interpolate","$compile","$parse","$rootScope"],g.$inject=["$translate","$rootScope"],i.$inject=["$translate","$rootScope"],l.$inject=["$parse","$translate"],m.$inject=["$cacheFactory"],angular.module("pascalprecht.translate",["ng"]).run(a),a.displayName="runTranslate",angular.module("pascalprecht.translate").provider("$translateSanitization",b),angular.module("pascalprecht.translate").constant("pascalprechtTranslateOverrider",{}).provider("$translate",c),c.displayName="displayName",angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",d),d.displayName="$translateDefaultInterpolation",angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",e),e.displayName="translateDirective",angular.module("pascalprecht.translate").directive("translateAttr",g),g.displayName="translateAttrDirective",angular.module("pascalprecht.translate").directive("translateCloak",i),i.displayName="translateCloakDirective",angular.module("pascalprecht.translate").directive("translateNamespace",j),j.displayName="translateNamespaceDirective",angular.module("pascalprecht.translate").directive("translateLanguage",k),k.displayName="translateLanguageDirective",angular.module("pascalprecht.translate").filter("translate",l),l.displayName="translateFilterFactory",angular.module("pascalprecht.translate").factory("$translationCache",m),m.displayName="$translationCache","pascalprecht.translate"}); \ No newline at end of file diff --git a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular_1.3.13/angular.js b/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular_1.3.13/angular.js deleted file mode 100644 index af2bde6e..00000000 --- a/io.sc.platform.lcdp.frontend/public/flowable/modeler/libs/angular_1.3.13/angular.js +++ /dev/null @@ -1,26139 +0,0 @@ -/** - * @license AngularJS v1.3.13 - * (c) 2010-2014 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, document, undefined) {'use strict'; - -/** - * @description - * - * This object provides a utility for producing rich Error messages within - * Angular. It can be called as follows: - * - * var exampleMinErr = minErr('example'); - * throw exampleMinErr('one', 'This {0} is {1}', foo, bar); - * - * The above creates an instance of minErr in the example namespace. The - * resulting error will have a namespaced error code of example.one. The - * resulting error will replace {0} with the value of foo, and {1} with the - * value of bar. The object is not restricted in the number of arguments it can - * take. - * - * If fewer arguments are specified than necessary for interpolation, the extra - * interpolation markers will be preserved in the final string. - * - * Since data will be parsed statically during a build step, some restrictions - * are applied with respect to how minErr instances are created and called. - * Instances should have names of the form namespaceMinErr for a minErr created - * using minErr('namespace') . Error codes, namespaces and template strings - * should all be static strings, not variables or general expressions. - * - * @param {string} module The namespace to use for the new minErr instance. - * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning - * error from returned function, for cases when a particular type of error is useful. - * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance - */ - -function minErr(module, ErrorConstructor) { - ErrorConstructor = ErrorConstructor || Error; - return function() { - var code = arguments[0], - prefix = '[' + (module ? module + ':' : '') + code + '] ', - template = arguments[1], - templateArgs = arguments, - - message, i; - - message = prefix + template.replace(/\{\d+\}/g, function(match) { - var index = +match.slice(1, -1), arg; - - if (index + 2 < templateArgs.length) { - return toDebugString(templateArgs[index + 2]); - } - return match; - }); - - message = message + '\nhttp://errors.angularjs.org/1.3.13/' + - (module ? module + '/' : '') + code; - for (i = 2; i < arguments.length; i++) { - message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' + - encodeURIComponent(toDebugString(arguments[i])); - } - return new ErrorConstructor(message); - }; -} - -/* We need to tell jshint what variables are being exported */ -/* global angular: true, - msie: true, - jqLite: true, - jQuery: true, - slice: true, - splice: true, - push: true, - toString: true, - ngMinErr: true, - angularModule: true, - uid: true, - REGEX_STRING_REGEXP: true, - VALIDITY_STATE_PROPERTY: true, - - lowercase: true, - uppercase: true, - manualLowercase: true, - manualUppercase: true, - nodeName_: true, - isArrayLike: true, - forEach: true, - sortedKeys: true, - forEachSorted: true, - reverseParams: true, - nextUid: true, - setHashKey: true, - extend: true, - int: true, - inherit: true, - noop: true, - identity: true, - valueFn: true, - isUndefined: true, - isDefined: true, - isObject: true, - isString: true, - isNumber: true, - isDate: true, - isArray: true, - isFunction: true, - isRegExp: true, - isWindow: true, - isScope: true, - isFile: true, - isFormData: true, - isBlob: true, - isBoolean: true, - isPromiseLike: true, - trim: true, - escapeForRegexp: true, - isElement: true, - makeMap: true, - includes: true, - arrayRemove: true, - copy: true, - shallowCopy: true, - equals: true, - csp: true, - concat: true, - sliceArgs: true, - bind: true, - toJsonReplacer: true, - toJson: true, - fromJson: true, - startingTag: true, - tryDecodeURIComponent: true, - parseKeyValue: true, - toKeyValue: true, - encodeUriSegment: true, - encodeUriQuery: true, - angularInit: true, - bootstrap: true, - getTestability: true, - snake_case: true, - bindJQuery: true, - assertArg: true, - assertArgFn: true, - assertNotHasOwnProperty: true, - getter: true, - getBlockNodes: true, - hasOwnProperty: true, - createMap: true, - - NODE_TYPE_ELEMENT: true, - NODE_TYPE_TEXT: true, - NODE_TYPE_COMMENT: true, - NODE_TYPE_DOCUMENT: true, - NODE_TYPE_DOCUMENT_FRAGMENT: true, -*/ - -//////////////////////////////////// - -/** - * @ngdoc module - * @name ng - * @module ng - * @description - * - * # ng (core module) - * The ng module is loaded by default when an AngularJS application is started. The module itself - * contains the essential components for an AngularJS application to function. The table below - * lists a high level breakdown of each of the services/factories, filters, directives and testing - * components available within this core module. - * - *
    - */ - -var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/; - -// The name of a form control's ValidityState property. -// This is used so that it's possible for internal tests to create mock ValidityStates. -var VALIDITY_STATE_PROPERTY = 'validity'; - -/** - * @ngdoc function - * @name angular.lowercase - * @module ng - * @kind function - * - * @description Converts the specified string to lowercase. - * @param {string} string String to be converted to lowercase. - * @returns {string} Lowercased string. - */ -var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;}; -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * @ngdoc function - * @name angular.uppercase - * @module ng - * @kind function - * - * @description Converts the specified string to uppercase. - * @param {string} string String to be converted to uppercase. - * @returns {string} Uppercased string. - */ -var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;}; - - -var manualLowercase = function(s) { - /* jshint bitwise: false */ - return isString(s) - ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);}) - : s; -}; -var manualUppercase = function(s) { - /* jshint bitwise: false */ - return isString(s) - ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);}) - : s; -}; - - -// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish -// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods -// with correct but slower alternatives. -if ('i' !== 'I'.toLowerCase()) { - lowercase = manualLowercase; - uppercase = manualUppercase; -} - - -var - msie, // holds major version number for IE, or NaN if UA is not IE. - jqLite, // delay binding since jQuery could be loaded after us. - jQuery, // delay binding - slice = [].slice, - splice = [].splice, - push = [].push, - toString = Object.prototype.toString, - ngMinErr = minErr('ng'), - - /** @name angular */ - angular = window.angular || (window.angular = {}), - angularModule, - uid = 0; - -/** - * documentMode is an IE-only property - * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx - */ -msie = document.documentMode; - - -/** - * @private - * @param {*} obj - * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, - * String ...) - */ -function isArrayLike(obj) { - if (obj == null || isWindow(obj)) { - return false; - } - - var length = obj.length; - - if (obj.nodeType === NODE_TYPE_ELEMENT && length) { - return true; - } - - return isString(obj) || isArray(obj) || length === 0 || - typeof length === 'number' && length > 0 && (length - 1) in obj; -} - -/** - * @ngdoc function - * @name angular.forEach - * @module ng - * @kind function - * - * @description - * Invokes the `iterator` function once for each item in `obj` collection, which can be either an - * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value` - * is the value of an object property or an array element, `key` is the object property key or - * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional. - * - * It is worth noting that `.forEach` does not iterate over inherited properties because it filters - * using the `hasOwnProperty` method. - * - * Unlike ES262's - * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18), - * Providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just - * return the value provided. - * - ```js - var values = {name: 'misko', gender: 'male'}; - var log = []; - angular.forEach(values, function(value, key) { - this.push(key + ': ' + value); - }, log); - expect(log).toEqual(['name: misko', 'gender: male']); - ``` - * - * @param {Object|Array} obj Object to iterate over. - * @param {Function} iterator Iterator function. - * @param {Object=} context Object to become context (`this`) for the iterator function. - * @returns {Object|Array} Reference to `obj`. - */ - -function forEach(obj, iterator, context) { - var key, length; - if (obj) { - if (isFunction(obj)) { - for (key in obj) { - // Need to check if hasOwnProperty exists, - // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function - if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { - iterator.call(context, obj[key], key, obj); - } - } - } else if (isArray(obj) || isArrayLike(obj)) { - var isPrimitive = typeof obj !== 'object'; - for (key = 0, length = obj.length; key < length; key++) { - if (isPrimitive || key in obj) { - iterator.call(context, obj[key], key, obj); - } - } - } else if (obj.forEach && obj.forEach !== forEach) { - obj.forEach(iterator, context, obj); - } else { - for (key in obj) { - if (obj.hasOwnProperty(key)) { - iterator.call(context, obj[key], key, obj); - } - } - } - } - return obj; -} - -function sortedKeys(obj) { - return Object.keys(obj).sort(); -} - -function forEachSorted(obj, iterator, context) { - var keys = sortedKeys(obj); - for (var i = 0; i < keys.length; i++) { - iterator.call(context, obj[keys[i]], keys[i]); - } - return keys; -} - - -/** - * when using forEach the params are value, key, but it is often useful to have key, value. - * @param {function(string, *)} iteratorFn - * @returns {function(*, string)} - */ -function reverseParams(iteratorFn) { - return function(value, key) { iteratorFn(key, value); }; -} - -/** - * A consistent way of creating unique IDs in angular. - * - * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before - * we hit number precision issues in JavaScript. - * - * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M - * - * @returns {number} an unique alpha-numeric string - */ -function nextUid() { - return ++uid; -} - - -/** - * Set or clear the hashkey for an object. - * @param obj object - * @param h the hashkey (!truthy to delete the hashkey) - */ -function setHashKey(obj, h) { - if (h) { - obj.$$hashKey = h; - } else { - delete obj.$$hashKey; - } -} - -/** - * @ngdoc function - * @name angular.extend - * @module ng - * @kind function - * - * @description - * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s) - * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so - * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`. - * Note: Keep in mind that `angular.extend` does not support recursive merge (deep copy). - * - * @param {Object} dst Destination object. - * @param {...Object} src Source object(s). - * @returns {Object} Reference to `dst`. - */ -function extend(dst) { - var h = dst.$$hashKey; - - for (var i = 1, ii = arguments.length; i < ii; i++) { - var obj = arguments[i]; - if (obj) { - var keys = Object.keys(obj); - for (var j = 0, jj = keys.length; j < jj; j++) { - var key = keys[j]; - dst[key] = obj[key]; - } - } - } - - setHashKey(dst, h); - return dst; -} - -function int(str) { - return parseInt(str, 10); -} - - -function inherit(parent, extra) { - return extend(Object.create(parent), extra); -} - -/** - * @ngdoc function - * @name angular.noop - * @module ng - * @kind function - * - * @description - * A function that performs no operations. This function can be useful when writing code in the - * functional style. - ```js - function foo(callback) { - var result = calculateResult(); - (callback || angular.noop)(result); - } - ``` - */ -function noop() {} -noop.$inject = []; - - -/** - * @ngdoc function - * @name angular.identity - * @module ng - * @kind function - * - * @description - * A function that returns its first argument. This function is useful when writing code in the - * functional style. - * - ```js - function transformer(transformationFn, value) { - return (transformationFn || angular.identity)(value); - }; - ``` - * @param {*} value to be returned. - * @returns {*} the value passed in. - */ -function identity($) {return $;} -identity.$inject = []; - - -function valueFn(value) {return function() {return value;};} - -/** - * @ngdoc function - * @name angular.isUndefined - * @module ng - * @kind function - * - * @description - * Determines if a reference is undefined. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is undefined. - */ -function isUndefined(value) {return typeof value === 'undefined';} - - -/** - * @ngdoc function - * @name angular.isDefined - * @module ng - * @kind function - * - * @description - * Determines if a reference is defined. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is defined. - */ -function isDefined(value) {return typeof value !== 'undefined';} - - -/** - * @ngdoc function - * @name angular.isObject - * @module ng - * @kind function - * - * @description - * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not - * considered to be objects. Note that JavaScript arrays are objects. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is an `Object` but not `null`. - */ -function isObject(value) { - // http://jsperf.com/isobject4 - return value !== null && typeof value === 'object'; -} - - -/** - * @ngdoc function - * @name angular.isString - * @module ng - * @kind function - * - * @description - * Determines if a reference is a `String`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `String`. - */ -function isString(value) {return typeof value === 'string';} - - -/** - * @ngdoc function - * @name angular.isNumber - * @module ng - * @kind function - * - * @description - * Determines if a reference is a `Number`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `Number`. - */ -function isNumber(value) {return typeof value === 'number';} - - -/** - * @ngdoc function - * @name angular.isDate - * @module ng - * @kind function - * - * @description - * Determines if a value is a date. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `Date`. - */ -function isDate(value) { - return toString.call(value) === '[object Date]'; -} - - -/** - * @ngdoc function - * @name angular.isArray - * @module ng - * @kind function - * - * @description - * Determines if a reference is an `Array`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is an `Array`. - */ -var isArray = Array.isArray; - -/** - * @ngdoc function - * @name angular.isFunction - * @module ng - * @kind function - * - * @description - * Determines if a reference is a `Function`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `Function`. - */ -function isFunction(value) {return typeof value === 'function';} - - -/** - * Determines if a value is a regular expression object. - * - * @private - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `RegExp`. - */ -function isRegExp(value) { - return toString.call(value) === '[object RegExp]'; -} - - -/** - * Checks if `obj` is a window object. - * - * @private - * @param {*} obj Object to check - * @returns {boolean} True if `obj` is a window obj. - */ -function isWindow(obj) { - return obj && obj.window === obj; -} - - -function isScope(obj) { - return obj && obj.$evalAsync && obj.$watch; -} - - -function isFile(obj) { - return toString.call(obj) === '[object File]'; -} - - -function isFormData(obj) { - return toString.call(obj) === '[object FormData]'; -} - - -function isBlob(obj) { - return toString.call(obj) === '[object Blob]'; -} - - -function isBoolean(value) { - return typeof value === 'boolean'; -} - - -function isPromiseLike(obj) { - return obj && isFunction(obj.then); -} - - -var trim = function(value) { - return isString(value) ? value.trim() : value; -}; - -// Copied from: -// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021 -// Prereq: s is a string. -var escapeForRegexp = function(s) { - return s.replace(/([-()\[\]{}+?*.$\^|,:#= 0) - array.splice(index, 1); - return value; -} - -/** - * @ngdoc function - * @name angular.copy - * @module ng - * @kind function - * - * @description - * Creates a deep copy of `source`, which should be an object or an array. - * - * * If no destination is supplied, a copy of the object or array is created. - * * If a destination is provided, all of its elements (for arrays) or properties (for objects) - * are deleted and then all elements/properties from the source are copied to it. - * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned. - * * If `source` is identical to 'destination' an exception will be thrown. - * - * @param {*} source The source that will be used to make a copy. - * Can be any type, including primitives, `null`, and `undefined`. - * @param {(Object|Array)=} destination Destination into which the source is copied. If - * provided, must be of the same type as `source`. - * @returns {*} The copy or updated `destination`, if `destination` was specified. - * - * @example - - -
    -
    - Name:
    - E-mail:
    - Gender: male - female
    - - -
    -
    form = {{user | json}}
    -
    master = {{master | json}}
    -
    - - -
    -
    - */ -function copy(source, destination, stackSource, stackDest) { - if (isWindow(source) || isScope(source)) { - throw ngMinErr('cpws', - "Can't copy! Making copies of Window or Scope instances is not supported."); - } - - if (!destination) { - destination = source; - if (source) { - if (isArray(source)) { - destination = copy(source, [], stackSource, stackDest); - } else if (isDate(source)) { - destination = new Date(source.getTime()); - } else if (isRegExp(source)) { - destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]); - destination.lastIndex = source.lastIndex; - } else if (isObject(source)) { - var emptyObject = Object.create(Object.getPrototypeOf(source)); - destination = copy(source, emptyObject, stackSource, stackDest); - } - } - } else { - if (source === destination) throw ngMinErr('cpi', - "Can't copy! Source and destination are identical."); - - stackSource = stackSource || []; - stackDest = stackDest || []; - - if (isObject(source)) { - var index = stackSource.indexOf(source); - if (index !== -1) return stackDest[index]; - - stackSource.push(source); - stackDest.push(destination); - } - - var result; - if (isArray(source)) { - destination.length = 0; - for (var i = 0; i < source.length; i++) { - result = copy(source[i], null, stackSource, stackDest); - if (isObject(source[i])) { - stackSource.push(source[i]); - stackDest.push(result); - } - destination.push(result); - } - } else { - var h = destination.$$hashKey; - if (isArray(destination)) { - destination.length = 0; - } else { - forEach(destination, function(value, key) { - delete destination[key]; - }); - } - for (var key in source) { - if (source.hasOwnProperty(key)) { - result = copy(source[key], null, stackSource, stackDest); - if (isObject(source[key])) { - stackSource.push(source[key]); - stackDest.push(result); - } - destination[key] = result; - } - } - setHashKey(destination,h); - } - - } - return destination; -} - -/** - * Creates a shallow copy of an object, an array or a primitive. - * - * Assumes that there are no proto properties for objects. - */ -function shallowCopy(src, dst) { - if (isArray(src)) { - dst = dst || []; - - for (var i = 0, ii = src.length; i < ii; i++) { - dst[i] = src[i]; - } - } else if (isObject(src)) { - dst = dst || {}; - - for (var key in src) { - if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) { - dst[key] = src[key]; - } - } - } - - return dst || src; -} - - -/** - * @ngdoc function - * @name angular.equals - * @module ng - * @kind function - * - * @description - * Determines if two objects or two values are equivalent. Supports value types, regular - * expressions, arrays and objects. - * - * Two objects or values are considered equivalent if at least one of the following is true: - * - * * Both objects or values pass `===` comparison. - * * Both objects or values are of the same type and all of their properties are equal by - * comparing them with `angular.equals`. - * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal) - * * Both values represent the same regular expression (In JavaScript, - * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual - * representation matches). - * - * During a property comparison, properties of `function` type and properties with names - * that begin with `$` are ignored. - * - * Scope and DOMWindow objects are being compared only by identify (`===`). - * - * @param {*} o1 Object or value to compare. - * @param {*} o2 Object or value to compare. - * @returns {boolean} True if arguments are equal. - */ -function equals(o1, o2) { - if (o1 === o2) return true; - if (o1 === null || o2 === null) return false; - if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN - var t1 = typeof o1, t2 = typeof o2, length, key, keySet; - if (t1 == t2) { - if (t1 == 'object') { - if (isArray(o1)) { - if (!isArray(o2)) return false; - if ((length = o1.length) == o2.length) { - for (key = 0; key < length; key++) { - if (!equals(o1[key], o2[key])) return false; - } - return true; - } - } else if (isDate(o1)) { - if (!isDate(o2)) return false; - return equals(o1.getTime(), o2.getTime()); - } else if (isRegExp(o1) && isRegExp(o2)) { - return o1.toString() == o2.toString(); - } else { - if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false; - keySet = {}; - for (key in o1) { - if (key.charAt(0) === '$' || isFunction(o1[key])) continue; - if (!equals(o1[key], o2[key])) return false; - keySet[key] = true; - } - for (key in o2) { - if (!keySet.hasOwnProperty(key) && - key.charAt(0) !== '$' && - o2[key] !== undefined && - !isFunction(o2[key])) return false; - } - return true; - } - } - } - return false; -} - -var csp = function() { - if (isDefined(csp.isActive_)) return csp.isActive_; - - var active = !!(document.querySelector('[ng-csp]') || - document.querySelector('[data-ng-csp]')); - - if (!active) { - try { - /* jshint -W031, -W054 */ - new Function(''); - /* jshint +W031, +W054 */ - } catch (e) { - active = true; - } - } - - return (csp.isActive_ = active); -}; - - - -function concat(array1, array2, index) { - return array1.concat(slice.call(array2, index)); -} - -function sliceArgs(args, startIndex) { - return slice.call(args, startIndex || 0); -} - - -/* jshint -W101 */ -/** - * @ngdoc function - * @name angular.bind - * @module ng - * @kind function - * - * @description - * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for - * `fn`). You can supply optional `args` that are prebound to the function. This feature is also - * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as - * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application). - * - * @param {Object} self Context which `fn` should be evaluated in. - * @param {function()} fn Function to be bound. - * @param {...*} args Optional arguments to be prebound to the `fn` function call. - * @returns {function()} Function that wraps the `fn` with all the specified bindings. - */ -/* jshint +W101 */ -function bind(self, fn) { - var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : []; - if (isFunction(fn) && !(fn instanceof RegExp)) { - return curryArgs.length - ? function() { - return arguments.length - ? fn.apply(self, concat(curryArgs, arguments, 0)) - : fn.apply(self, curryArgs); - } - : function() { - return arguments.length - ? fn.apply(self, arguments) - : fn.call(self); - }; - } else { - // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) - return fn; - } -} - - -function toJsonReplacer(key, value) { - var val = value; - - if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') { - val = undefined; - } else if (isWindow(value)) { - val = '$WINDOW'; - } else if (value && document === value) { - val = '$DOCUMENT'; - } else if (isScope(value)) { - val = '$SCOPE'; - } - - return val; -} - - -/** - * @ngdoc function - * @name angular.toJson - * @module ng - * @kind function - * - * @description - * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be - * stripped since angular uses this notation internally. - * - * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. - * @param {boolean|number=} pretty If set to true, the JSON output will contain newlines and whitespace. - * If set to an integer, the JSON output will contain that many spaces per indentation (the default is 2). - * @returns {string|undefined} JSON-ified string representing `obj`. - */ -function toJson(obj, pretty) { - if (typeof obj === 'undefined') return undefined; - if (!isNumber(pretty)) { - pretty = pretty ? 2 : null; - } - return JSON.stringify(obj, toJsonReplacer, pretty); -} - - -/** - * @ngdoc function - * @name angular.fromJson - * @module ng - * @kind function - * - * @description - * Deserializes a JSON string. - * - * @param {string} json JSON string to deserialize. - * @returns {Object|Array|string|number} Deserialized JSON string. - */ -function fromJson(json) { - return isString(json) - ? JSON.parse(json) - : json; -} - - -/** - * @returns {string} Returns the string representation of the element. - */ -function startingTag(element) { - element = jqLite(element).clone(); - try { - // turns out IE does not let you set .html() on elements which - // are not allowed to have children. So we just ignore it. - element.empty(); - } catch (e) {} - var elemHtml = jqLite('
    ').append(element).html(); - try { - return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) : - elemHtml. - match(/^(<[^>]+>)/)[1]. - replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); - } catch (e) { - return lowercase(elemHtml); - } - -} - - -///////////////////////////////////////////////// - -/** - * Tries to decode the URI component without throwing an exception. - * - * @private - * @param str value potential URI component to check. - * @returns {boolean} True if `value` can be decoded - * with the decodeURIComponent function. - */ -function tryDecodeURIComponent(value) { - try { - return decodeURIComponent(value); - } catch (e) { - // Ignore any invalid uri component - } -} - - -/** - * Parses an escaped url query string into key-value pairs. - * @returns {Object.} - */ -function parseKeyValue(/**string*/keyValue) { - var obj = {}, key_value, key; - forEach((keyValue || "").split('&'), function(keyValue) { - if (keyValue) { - key_value = keyValue.replace(/\+/g,'%20').split('='); - key = tryDecodeURIComponent(key_value[0]); - if (isDefined(key)) { - var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; - if (!hasOwnProperty.call(obj, key)) { - obj[key] = val; - } else if (isArray(obj[key])) { - obj[key].push(val); - } else { - obj[key] = [obj[key],val]; - } - } - } - }); - return obj; -} - -function toKeyValue(obj) { - var parts = []; - forEach(obj, function(value, key) { - if (isArray(value)) { - forEach(value, function(arrayValue) { - parts.push(encodeUriQuery(key, true) + - (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true))); - }); - } else { - parts.push(encodeUriQuery(key, true) + - (value === true ? '' : '=' + encodeUriQuery(value, true))); - } - }); - return parts.length ? parts.join('&') : ''; -} - - -/** - * We need our custom method because encodeURIComponent is too aggressive and doesn't follow - * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path - * segments: - * segment = *pchar - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * pct-encoded = "%" HEXDIG HEXDIG - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ -function encodeUriSegment(val) { - return encodeUriQuery(val, true). - replace(/%26/gi, '&'). - replace(/%3D/gi, '='). - replace(/%2B/gi, '+'); -} - - -/** - * This method is intended for encoding *key* or *value* parts of query component. We need a custom - * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be - * encoded per http://tools.ietf.org/html/rfc3986: - * query = *( pchar / "/" / "?" ) - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * pct-encoded = "%" HEXDIG HEXDIG - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ -function encodeUriQuery(val, pctEncodeSpaces) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%3B/gi, ';'). - replace(/%20/g, (pctEncodeSpaces ? '%20' : '+')); -} - -var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-']; - -function getNgAttribute(element, ngAttr) { - var attr, i, ii = ngAttrPrefixes.length; - element = jqLite(element); - for (i = 0; i < ii; ++i) { - attr = ngAttrPrefixes[i] + ngAttr; - if (isString(attr = element.attr(attr))) { - return attr; - } - } - return null; -} - -/** - * @ngdoc directive - * @name ngApp - * @module ng - * - * @element ANY - * @param {angular.Module} ngApp an optional application - * {@link angular.module module} name to load. - * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be - * created in "strict-di" mode. This means that the application will fail to invoke functions which - * do not use explicit function annotation (and are thus unsuitable for minification), as described - * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in - * tracking down the root of these bugs. - * - * @description - * - * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive - * designates the **root element** of the application and is typically placed near the root element - * of the page - e.g. on the `` or `` tags. - * - * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp` - * found in the document will be used to define the root element to auto-bootstrap as an - * application. To run multiple applications in an HTML document you must manually bootstrap them using - * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other. - * - * You can specify an **AngularJS module** to be used as the root module for the application. This - * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It - * should contain the application code needed or have dependencies on other modules that will - * contain the code. See {@link angular.module} for more information. - * - * In the example below if the `ngApp` directive were not placed on the `html` element then the - * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}` - * would not be resolved to `3`. - * - * `ngApp` is the easiest, and most common way to bootstrap an application. - * - - -
    - I can add: {{a}} + {{b}} = {{ a+b }} -
    -
    - - angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) { - $scope.a = 1; - $scope.b = 2; - }); - -
    - * - * Using `ngStrictDi`, you would see something like this: - * - - -
    -
    - I can add: {{a}} + {{b}} = {{ a+b }} - -

    This renders because the controller does not fail to - instantiate, by using explicit annotation style (see - script.js for details) -

    -
    - -
    - Name:
    - Hello, {{name}}! - -

    This renders because the controller does not fail to - instantiate, by using explicit annotation style - (see script.js for details) -

    -
    - -
    - I can add: {{a}} + {{b}} = {{ a+b }} - -

    The controller could not be instantiated, due to relying - on automatic function annotations (which are disabled in - strict mode). As such, the content of this section is not - interpolated, and there should be an error in your web console. -

    -
    -
    -
    - - angular.module('ngAppStrictDemo', []) - // BadController will fail to instantiate, due to relying on automatic function annotation, - // rather than an explicit annotation - .controller('BadController', function($scope) { - $scope.a = 1; - $scope.b = 2; - }) - // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated, - // due to using explicit annotations using the array style and $inject property, respectively. - .controller('GoodController1', ['$scope', function($scope) { - $scope.a = 1; - $scope.b = 2; - }]) - .controller('GoodController2', GoodController2); - function GoodController2($scope) { - $scope.name = "World"; - } - GoodController2.$inject = ['$scope']; - - - div[ng-controller] { - margin-bottom: 1em; - -webkit-border-radius: 4px; - border-radius: 4px; - border: 1px solid; - padding: .5em; - } - div[ng-controller^=Good] { - border-color: #d6e9c6; - background-color: #dff0d8; - color: #3c763d; - } - div[ng-controller^=Bad] { - border-color: #ebccd1; - background-color: #f2dede; - color: #a94442; - margin-bottom: 0; - } - -
    - */ -function angularInit(element, bootstrap) { - var appElement, - module, - config = {}; - - // The element `element` has priority over any other element - forEach(ngAttrPrefixes, function(prefix) { - var name = prefix + 'app'; - - if (!appElement && element.hasAttribute && element.hasAttribute(name)) { - appElement = element; - module = element.getAttribute(name); - } - }); - forEach(ngAttrPrefixes, function(prefix) { - var name = prefix + 'app'; - var candidate; - - if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) { - appElement = candidate; - module = candidate.getAttribute(name); - } - }); - if (appElement) { - config.strictDi = getNgAttribute(appElement, "strict-di") !== null; - bootstrap(appElement, module ? [module] : [], config); - } -} - -/** - * @ngdoc function - * @name angular.bootstrap - * @module ng - * @description - * Use this function to manually start up angular application. - * - * See: {@link guide/bootstrap Bootstrap} - * - * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually. - * They must use {@link ng.directive:ngApp ngApp}. - * - * Angular will detect if it has been loaded into the browser more than once and only allow the - * first loaded script to be bootstrapped and will report a warning to the browser console for - * each of the subsequent scripts. This prevents strange results in applications, where otherwise - * multiple instances of Angular try to work on the DOM. - * - * ```html - * - * - * - *
    - * {{greeting}} - *
    - * - * - * - * - * - * ``` - * - * @param {DOMElement} element DOM element which is the root of angular application. - * @param {Array=} modules an array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a `config` block. - * See: {@link angular.module modules} - * @param {Object=} config an object for defining configuration options for the application. The - * following keys are supported: - * - * * `strictDi` - disable automatic function annotation for the application. This is meant to - * assist in finding bugs which break minified code. Defaults to `false`. - * - * @returns {auto.$injector} Returns the newly created injector for this app. - */ -function bootstrap(element, modules, config) { - if (!isObject(config)) config = {}; - var defaultConfig = { - strictDi: false - }; - config = extend(defaultConfig, config); - var doBootstrap = function() { - element = jqLite(element); - - if (element.injector()) { - var tag = (element[0] === document) ? 'document' : startingTag(element); - //Encode angle brackets to prevent input from being sanitized to empty string #8683 - throw ngMinErr( - 'btstrpd', - "App Already Bootstrapped with this Element '{0}'", - tag.replace(//,'>')); - } - - modules = modules || []; - modules.unshift(['$provide', function($provide) { - $provide.value('$rootElement', element); - }]); - - if (config.debugInfoEnabled) { - // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`. - modules.push(['$compileProvider', function($compileProvider) { - $compileProvider.debugInfoEnabled(true); - }]); - } - - modules.unshift('ng'); - var injector = createInjector(modules, config.strictDi); - injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', - function bootstrapApply(scope, element, compile, injector) { - scope.$apply(function() { - element.data('$injector', injector); - compile(element)(scope); - }); - }] - ); - return injector; - }; - - var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/; - var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/; - - if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) { - config.debugInfoEnabled = true; - window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, ''); - } - - if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) { - return doBootstrap(); - } - - window.name = window.name.replace(NG_DEFER_BOOTSTRAP, ''); - angular.resumeBootstrap = function(extraModules) { - forEach(extraModules, function(module) { - modules.push(module); - }); - return doBootstrap(); - }; - - if (isFunction(angular.resumeDeferredBootstrap)) { - angular.resumeDeferredBootstrap(); - } -} - -/** - * @ngdoc function - * @name angular.reloadWithDebugInfo - * @module ng - * @description - * Use this function to reload the current application with debug information turned on. - * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`. - * - * See {@link ng.$compileProvider#debugInfoEnabled} for more. - */ -function reloadWithDebugInfo() { - window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name; - window.location.reload(); -} - -/** - * @name angular.getTestability - * @module ng - * @description - * Get the testability service for the instance of Angular on the given - * element. - * @param {DOMElement} element DOM element which is the root of angular application. - */ -function getTestability(rootElement) { - var injector = angular.element(rootElement).injector(); - if (!injector) { - throw ngMinErr('test', - 'no injector found for element argument to getTestability'); - } - return injector.get('$$testability'); -} - -var SNAKE_CASE_REGEXP = /[A-Z]/g; -function snake_case(name, separator) { - separator = separator || '_'; - return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); -} - -var bindJQueryFired = false; -var skipDestroyOnNextJQueryCleanData; -function bindJQuery() { - var originalCleanData; - - if (bindJQueryFired) { - return; - } - - // bind to jQuery if present; - jQuery = window.jQuery; - // Use jQuery if it exists with proper functionality, otherwise default to us. - // Angular 1.2+ requires jQuery 1.7+ for on()/off() support. - // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older - // versions. It will not work for sure with jQuery <1.7, though. - if (jQuery && jQuery.fn.on) { - jqLite = jQuery; - extend(jQuery.fn, { - scope: JQLitePrototype.scope, - isolateScope: JQLitePrototype.isolateScope, - controller: JQLitePrototype.controller, - injector: JQLitePrototype.injector, - inheritedData: JQLitePrototype.inheritedData - }); - - // All nodes removed from the DOM via various jQuery APIs like .remove() - // are passed through jQuery.cleanData. Monkey-patch this method to fire - // the $destroy event on all removed nodes. - originalCleanData = jQuery.cleanData; - jQuery.cleanData = function(elems) { - var events; - if (!skipDestroyOnNextJQueryCleanData) { - for (var i = 0, elem; (elem = elems[i]) != null; i++) { - events = jQuery._data(elem, "events"); - if (events && events.$destroy) { - jQuery(elem).triggerHandler('$destroy'); - } - } - } else { - skipDestroyOnNextJQueryCleanData = false; - } - originalCleanData(elems); - }; - } else { - jqLite = JQLite; - } - - angular.element = jqLite; - - // Prevent double-proxying. - bindJQueryFired = true; -} - -/** - * throw error if the argument is falsy. - */ -function assertArg(arg, name, reason) { - if (!arg) { - throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required")); - } - return arg; -} - -function assertArgFn(arg, name, acceptArrayAnnotation) { - if (acceptArrayAnnotation && isArray(arg)) { - arg = arg[arg.length - 1]; - } - - assertArg(isFunction(arg), name, 'not a function, got ' + - (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg)); - return arg; -} - -/** - * throw error if the name given is hasOwnProperty - * @param {String} name the name to test - * @param {String} context the context in which the name is used, such as module or directive - */ -function assertNotHasOwnProperty(name, context) { - if (name === 'hasOwnProperty') { - throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context); - } -} - -/** - * Return the value accessible from the object by path. Any undefined traversals are ignored - * @param {Object} obj starting object - * @param {String} path path to traverse - * @param {boolean} [bindFnToScope=true] - * @returns {Object} value as accessible by path - */ -//TODO(misko): this function needs to be removed -function getter(obj, path, bindFnToScope) { - if (!path) return obj; - var keys = path.split('.'); - var key; - var lastInstance = obj; - var len = keys.length; - - for (var i = 0; i < len; i++) { - key = keys[i]; - if (obj) { - obj = (lastInstance = obj)[key]; - } - } - if (!bindFnToScope && isFunction(obj)) { - return bind(lastInstance, obj); - } - return obj; -} - -/** - * Return the DOM siblings between the first and last node in the given array. - * @param {Array} array like object - * @returns {jqLite} jqLite collection containing the nodes - */ -function getBlockNodes(nodes) { - // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original - // collection, otherwise update the original collection. - var node = nodes[0]; - var endNode = nodes[nodes.length - 1]; - var blockNodes = [node]; - - do { - node = node.nextSibling; - if (!node) break; - blockNodes.push(node); - } while (node !== endNode); - - return jqLite(blockNodes); -} - - -/** - * Creates a new object without a prototype. This object is useful for lookup without having to - * guard against prototypically inherited properties via hasOwnProperty. - * - * Related micro-benchmarks: - * - http://jsperf.com/object-create2 - * - http://jsperf.com/proto-map-lookup/2 - * - http://jsperf.com/for-in-vs-object-keys2 - * - * @returns {Object} - */ -function createMap() { - return Object.create(null); -} - -var NODE_TYPE_ELEMENT = 1; -var NODE_TYPE_TEXT = 3; -var NODE_TYPE_COMMENT = 8; -var NODE_TYPE_DOCUMENT = 9; -var NODE_TYPE_DOCUMENT_FRAGMENT = 11; - -/** - * @ngdoc type - * @name angular.Module - * @module ng - * @description - * - * Interface for configuring angular {@link angular.module modules}. - */ - -function setupModuleLoader(window) { - - var $injectorMinErr = minErr('$injector'); - var ngMinErr = minErr('ng'); - - function ensure(obj, name, factory) { - return obj[name] || (obj[name] = factory()); - } - - var angular = ensure(window, 'angular', Object); - - // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap - angular.$$minErr = angular.$$minErr || minErr; - - return ensure(angular, 'module', function() { - /** @type {Object.} */ - var modules = {}; - - /** - * @ngdoc function - * @name angular.module - * @module ng - * @description - * - * The `angular.module` is a global place for creating, registering and retrieving Angular - * modules. - * All modules (angular core or 3rd party) that should be available to an application must be - * registered using this mechanism. - * - * When passed two or more arguments, a new module is created. If passed only one argument, an - * existing module (the name passed as the first argument to `module`) is retrieved. - * - * - * # Module - * - * A module is a collection of services, directives, controllers, filters, and configuration information. - * `angular.module` is used to configure the {@link auto.$injector $injector}. - * - * ```js - * // Create a new module - * var myModule = angular.module('myModule', []); - * - * // register a new service - * myModule.value('appName', 'MyCoolApp'); - * - * // configure existing services inside initialization blocks. - * myModule.config(['$locationProvider', function($locationProvider) { - * // Configure existing providers - * $locationProvider.hashPrefix('!'); - * }]); - * ``` - * - * Then you can create an injector and load your modules like this: - * - * ```js - * var injector = angular.injector(['ng', 'myModule']) - * ``` - * - * However it's more likely that you'll just use - * {@link ng.directive:ngApp ngApp} or - * {@link angular.bootstrap} to simplify this process for you. - * - * @param {!string} name The name of the module to create or retrieve. - * @param {!Array.=} requires If specified then new module is being created. If - * unspecified then the module is being retrieved for further configuration. - * @param {Function=} configFn Optional configuration function for the module. Same as - * {@link angular.Module#config Module#config()}. - * @returns {module} new module with the {@link angular.Module} api. - */ - return function module(name, requires, configFn) { - var assertNotHasOwnProperty = function(name, context) { - if (name === 'hasOwnProperty') { - throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); - } - }; - - assertNotHasOwnProperty(name, 'module'); - if (requires && modules.hasOwnProperty(name)) { - modules[name] = null; - } - return ensure(modules, name, function() { - if (!requires) { - throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + - "the module name or forgot to load it. If registering a module ensure that you " + - "specify the dependencies as the second argument.", name); - } - - /** @type {!Array.>} */ - var invokeQueue = []; - - /** @type {!Array.} */ - var configBlocks = []; - - /** @type {!Array.} */ - var runBlocks = []; - - var config = invokeLater('$injector', 'invoke', 'push', configBlocks); - - /** @type {angular.Module} */ - var moduleInstance = { - // Private state - _invokeQueue: invokeQueue, - _configBlocks: configBlocks, - _runBlocks: runBlocks, - - /** - * @ngdoc property - * @name angular.Module#requires - * @module ng - * - * @description - * Holds the list of modules which the injector will load before the current module is - * loaded. - */ - requires: requires, - - /** - * @ngdoc property - * @name angular.Module#name - * @module ng - * - * @description - * Name of the module. - */ - name: name, - - - /** - * @ngdoc method - * @name angular.Module#provider - * @module ng - * @param {string} name service name - * @param {Function} providerType Construction function for creating new instance of the - * service. - * @description - * See {@link auto.$provide#provider $provide.provider()}. - */ - provider: invokeLater('$provide', 'provider'), - - /** - * @ngdoc method - * @name angular.Module#factory - * @module ng - * @param {string} name service name - * @param {Function} providerFunction Function for creating new instance of the service. - * @description - * See {@link auto.$provide#factory $provide.factory()}. - */ - factory: invokeLater('$provide', 'factory'), - - /** - * @ngdoc method - * @name angular.Module#service - * @module ng - * @param {string} name service name - * @param {Function} constructor A constructor function that will be instantiated. - * @description - * See {@link auto.$provide#service $provide.service()}. - */ - service: invokeLater('$provide', 'service'), - - /** - * @ngdoc method - * @name angular.Module#value - * @module ng - * @param {string} name service name - * @param {*} object Service instance object. - * @description - * See {@link auto.$provide#value $provide.value()}. - */ - value: invokeLater('$provide', 'value'), - - /** - * @ngdoc method - * @name angular.Module#constant - * @module ng - * @param {string} name constant name - * @param {*} object Constant value. - * @description - * Because the constant are fixed, they get applied before other provide methods. - * See {@link auto.$provide#constant $provide.constant()}. - */ - constant: invokeLater('$provide', 'constant', 'unshift'), - - /** - * @ngdoc method - * @name angular.Module#animation - * @module ng - * @param {string} name animation name - * @param {Function} animationFactory Factory function for creating new instance of an - * animation. - * @description - * - * **NOTE**: animations take effect only if the **ngAnimate** module is loaded. - * - * - * Defines an animation hook that can be later used with - * {@link ngAnimate.$animate $animate} service and directives that use this service. - * - * ```js - * module.animation('.animation-name', function($inject1, $inject2) { - * return { - * eventName : function(element, done) { - * //code to run the animation - * //once complete, then run done() - * return function cancellationFunction(element) { - * //code to cancel the animation - * } - * } - * } - * }) - * ``` - * - * See {@link ng.$animateProvider#register $animateProvider.register()} and - * {@link ngAnimate ngAnimate module} for more information. - */ - animation: invokeLater('$animateProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#filter - * @module ng - * @param {string} name Filter name. - * @param {Function} filterFactory Factory function for creating new instance of filter. - * @description - * See {@link ng.$filterProvider#register $filterProvider.register()}. - */ - filter: invokeLater('$filterProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#controller - * @module ng - * @param {string|Object} name Controller name, or an object map of controllers where the - * keys are the names and the values are the constructors. - * @param {Function} constructor Controller constructor function. - * @description - * See {@link ng.$controllerProvider#register $controllerProvider.register()}. - */ - controller: invokeLater('$controllerProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#directive - * @module ng - * @param {string|Object} name Directive name, or an object map of directives where the - * keys are the names and the values are the factories. - * @param {Function} directiveFactory Factory function for creating new instance of - * directives. - * @description - * See {@link ng.$compileProvider#directive $compileProvider.directive()}. - */ - directive: invokeLater('$compileProvider', 'directive'), - - /** - * @ngdoc method - * @name angular.Module#config - * @module ng - * @param {Function} configFn Execute this function on module load. Useful for service - * configuration. - * @description - * Use this method to register work which needs to be performed on module loading. - * For more about how to configure services, see - * {@link providers#provider-recipe Provider Recipe}. - */ - config: config, - - /** - * @ngdoc method - * @name angular.Module#run - * @module ng - * @param {Function} initializationFn Execute this function after injector creation. - * Useful for application initialization. - * @description - * Use this method to register work which should be performed when the injector is done - * loading all modules. - */ - run: function(block) { - runBlocks.push(block); - return this; - } - }; - - if (configFn) { - config(configFn); - } - - return moduleInstance; - - /** - * @param {string} provider - * @param {string} method - * @param {String=} insertMethod - * @returns {angular.Module} - */ - function invokeLater(provider, method, insertMethod, queue) { - if (!queue) queue = invokeQueue; - return function() { - queue[insertMethod || 'push']([provider, method, arguments]); - return moduleInstance; - }; - } - }); - }; - }); - -} - -/* global: toDebugString: true */ - -function serializeObject(obj) { - var seen = []; - - return JSON.stringify(obj, function(key, val) { - val = toJsonReplacer(key, val); - if (isObject(val)) { - - if (seen.indexOf(val) >= 0) return '<>'; - - seen.push(val); - } - return val; - }); -} - -function toDebugString(obj) { - if (typeof obj === 'function') { - return obj.toString().replace(/ \{[\s\S]*$/, ''); - } else if (typeof obj === 'undefined') { - return 'undefined'; - } else if (typeof obj !== 'string') { - return serializeObject(obj); - } - return obj; -} - -/* global angularModule: true, - version: true, - - $LocaleProvider, - $CompileProvider, - - htmlAnchorDirective, - inputDirective, - inputDirective, - formDirective, - scriptDirective, - selectDirective, - styleDirective, - optionDirective, - ngBindDirective, - ngBindHtmlDirective, - ngBindTemplateDirective, - ngClassDirective, - ngClassEvenDirective, - ngClassOddDirective, - ngCspDirective, - ngCloakDirective, - ngControllerDirective, - ngFormDirective, - ngHideDirective, - ngIfDirective, - ngIncludeDirective, - ngIncludeFillContentDirective, - ngInitDirective, - ngNonBindableDirective, - ngPluralizeDirective, - ngRepeatDirective, - ngShowDirective, - ngStyleDirective, - ngSwitchDirective, - ngSwitchWhenDirective, - ngSwitchDefaultDirective, - ngOptionsDirective, - ngTranscludeDirective, - ngModelDirective, - ngListDirective, - ngChangeDirective, - patternDirective, - patternDirective, - requiredDirective, - requiredDirective, - minlengthDirective, - minlengthDirective, - maxlengthDirective, - maxlengthDirective, - ngValueDirective, - ngModelOptionsDirective, - ngAttributeAliasDirectives, - ngEventDirectives, - - $AnchorScrollProvider, - $AnimateProvider, - $BrowserProvider, - $CacheFactoryProvider, - $ControllerProvider, - $DocumentProvider, - $ExceptionHandlerProvider, - $FilterProvider, - $InterpolateProvider, - $IntervalProvider, - $HttpProvider, - $HttpBackendProvider, - $LocationProvider, - $LogProvider, - $ParseProvider, - $RootScopeProvider, - $QProvider, - $$QProvider, - $$SanitizeUriProvider, - $SceProvider, - $SceDelegateProvider, - $SnifferProvider, - $TemplateCacheProvider, - $TemplateRequestProvider, - $$TestabilityProvider, - $TimeoutProvider, - $$RAFProvider, - $$AsyncCallbackProvider, - $WindowProvider, - $$jqLiteProvider -*/ - - -/** - * @ngdoc object - * @name angular.version - * @module ng - * @description - * An object that contains information about the current AngularJS version. This object has the - * following properties: - * - * - `full` – `{string}` – Full version string, such as "0.9.18". - * - `major` – `{number}` – Major version number, such as "0". - * - `minor` – `{number}` – Minor version number, such as "9". - * - `dot` – `{number}` – Dot version number, such as "18". - * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". - */ -var version = { - full: '1.3.13', // all of these placeholder strings will be replaced by grunt's - major: 1, // package task - minor: 3, - dot: 13, - codeName: 'meticulous-riffleshuffle' -}; - - -function publishExternalAPI(angular) { - extend(angular, { - 'bootstrap': bootstrap, - 'copy': copy, - 'extend': extend, - 'equals': equals, - 'element': jqLite, - 'forEach': forEach, - 'injector': createInjector, - 'noop': noop, - 'bind': bind, - 'toJson': toJson, - 'fromJson': fromJson, - 'identity': identity, - 'isUndefined': isUndefined, - 'isDefined': isDefined, - 'isString': isString, - 'isFunction': isFunction, - 'isObject': isObject, - 'isNumber': isNumber, - 'isElement': isElement, - 'isArray': isArray, - 'version': version, - 'isDate': isDate, - 'lowercase': lowercase, - 'uppercase': uppercase, - 'callbacks': {counter: 0}, - 'getTestability': getTestability, - '$$minErr': minErr, - '$$csp': csp, - 'reloadWithDebugInfo': reloadWithDebugInfo - }); - - angularModule = setupModuleLoader(window); - try { - angularModule('ngLocale'); - } catch (e) { - angularModule('ngLocale', []).provider('$locale', $LocaleProvider); - } - - angularModule('ng', ['ngLocale'], ['$provide', - function ngModule($provide) { - // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it. - $provide.provider({ - $$sanitizeUri: $$SanitizeUriProvider - }); - $provide.provider('$compile', $CompileProvider). - directive({ - a: htmlAnchorDirective, - input: inputDirective, - textarea: inputDirective, - form: formDirective, - script: scriptDirective, - select: selectDirective, - style: styleDirective, - option: optionDirective, - ngBind: ngBindDirective, - ngBindHtml: ngBindHtmlDirective, - ngBindTemplate: ngBindTemplateDirective, - ngClass: ngClassDirective, - ngClassEven: ngClassEvenDirective, - ngClassOdd: ngClassOddDirective, - ngCloak: ngCloakDirective, - ngController: ngControllerDirective, - ngForm: ngFormDirective, - ngHide: ngHideDirective, - ngIf: ngIfDirective, - ngInclude: ngIncludeDirective, - ngInit: ngInitDirective, - ngNonBindable: ngNonBindableDirective, - ngPluralize: ngPluralizeDirective, - ngRepeat: ngRepeatDirective, - ngShow: ngShowDirective, - ngStyle: ngStyleDirective, - ngSwitch: ngSwitchDirective, - ngSwitchWhen: ngSwitchWhenDirective, - ngSwitchDefault: ngSwitchDefaultDirective, - ngOptions: ngOptionsDirective, - ngTransclude: ngTranscludeDirective, - ngModel: ngModelDirective, - ngList: ngListDirective, - ngChange: ngChangeDirective, - pattern: patternDirective, - ngPattern: patternDirective, - required: requiredDirective, - ngRequired: requiredDirective, - minlength: minlengthDirective, - ngMinlength: minlengthDirective, - maxlength: maxlengthDirective, - ngMaxlength: maxlengthDirective, - ngValue: ngValueDirective, - ngModelOptions: ngModelOptionsDirective - }). - directive({ - ngInclude: ngIncludeFillContentDirective - }). - directive(ngAttributeAliasDirectives). - directive(ngEventDirectives); - $provide.provider({ - $anchorScroll: $AnchorScrollProvider, - $animate: $AnimateProvider, - $browser: $BrowserProvider, - $cacheFactory: $CacheFactoryProvider, - $controller: $ControllerProvider, - $document: $DocumentProvider, - $exceptionHandler: $ExceptionHandlerProvider, - $filter: $FilterProvider, - $interpolate: $InterpolateProvider, - $interval: $IntervalProvider, - $http: $HttpProvider, - $httpBackend: $HttpBackendProvider, - $location: $LocationProvider, - $log: $LogProvider, - $parse: $ParseProvider, - $rootScope: $RootScopeProvider, - $q: $QProvider, - $$q: $$QProvider, - $sce: $SceProvider, - $sceDelegate: $SceDelegateProvider, - $sniffer: $SnifferProvider, - $templateCache: $TemplateCacheProvider, - $templateRequest: $TemplateRequestProvider, - $$testability: $$TestabilityProvider, - $timeout: $TimeoutProvider, - $window: $WindowProvider, - $$rAF: $$RAFProvider, - $$asyncCallback: $$AsyncCallbackProvider, - $$jqLite: $$jqLiteProvider - }); - } - ]); -} - -/* global JQLitePrototype: true, - addEventListenerFn: true, - removeEventListenerFn: true, - BOOLEAN_ATTR: true, - ALIASED_ATTR: true, -*/ - -////////////////////////////////// -//JQLite -////////////////////////////////// - -/** - * @ngdoc function - * @name angular.element - * @module ng - * @kind function - * - * @description - * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. - * - * If jQuery is available, `angular.element` is an alias for the - * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element` - * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." - * - *
    jqLite is a tiny, API-compatible subset of jQuery that allows - * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most - * commonly needed functionality with the goal of having a very small footprint.
    - * - * To use jQuery, simply load it before `DOMContentLoaded` event fired. - * - *
    **Note:** all element references in Angular are always wrapped with jQuery or - * jqLite; they are never raw DOM references.
    - * - * ## Angular's jqLite - * jqLite provides only the following jQuery methods: - * - * - [`addClass()`](http://api.jquery.com/addClass/) - * - [`after()`](http://api.jquery.com/after/) - * - [`append()`](http://api.jquery.com/append/) - * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters - * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData - * - [`children()`](http://api.jquery.com/children/) - Does not support selectors - * - [`clone()`](http://api.jquery.com/clone/) - * - [`contents()`](http://api.jquery.com/contents/) - * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()` - * - [`data()`](http://api.jquery.com/data/) - * - [`detach()`](http://api.jquery.com/detach/) - * - [`empty()`](http://api.jquery.com/empty/) - * - [`eq()`](http://api.jquery.com/eq/) - * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name - * - [`hasClass()`](http://api.jquery.com/hasClass/) - * - [`html()`](http://api.jquery.com/html/) - * - [`next()`](http://api.jquery.com/next/) - Does not support selectors - * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData - * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors - * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors - * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors - * - [`prepend()`](http://api.jquery.com/prepend/) - * - [`prop()`](http://api.jquery.com/prop/) - * - [`ready()`](http://api.jquery.com/ready/) - * - [`remove()`](http://api.jquery.com/remove/) - * - [`removeAttr()`](http://api.jquery.com/removeAttr/) - * - [`removeClass()`](http://api.jquery.com/removeClass/) - * - [`removeData()`](http://api.jquery.com/removeData/) - * - [`replaceWith()`](http://api.jquery.com/replaceWith/) - * - [`text()`](http://api.jquery.com/text/) - * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers. - * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces - * - [`val()`](http://api.jquery.com/val/) - * - [`wrap()`](http://api.jquery.com/wrap/) - * - * ## jQuery/jqLite Extras - * Angular also provides the following additional methods and events to both jQuery and jqLite: - * - * ### Events - * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event - * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM - * element before it is removed. - * - * ### Methods - * - `controller(name)` - retrieves the controller of the current element or its parent. By default - * retrieves controller associated with the `ngController` directive. If `name` is provided as - * camelCase directive name, then the controller for this directive will be retrieved (e.g. - * `'ngModel'`). - * - `injector()` - retrieves the injector of the current element or its parent. - * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current - * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to - * be enabled. - * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the - * current element. This getter should be used only on elements that contain a directive which starts a new isolate - * scope. Calling `scope()` on this element always returns the original non-isolate scope. - * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled. - * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top - * parent element is reached. - * - * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. - * @returns {Object} jQuery object. - */ - -JQLite.expando = 'ng339'; - -var jqCache = JQLite.cache = {}, - jqId = 1, - addEventListenerFn = function(element, type, fn) { - element.addEventListener(type, fn, false); - }, - removeEventListenerFn = function(element, type, fn) { - element.removeEventListener(type, fn, false); - }; - -/* - * !!! This is an undocumented "private" function !!! - */ -JQLite._data = function(node) { - //jQuery always returns an object on cache miss - return this.cache[node[this.expando]] || {}; -}; - -function jqNextId() { return ++jqId; } - - -var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; -var MOZ_HACK_REGEXP = /^moz([A-Z])/; -var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"}; -var jqLiteMinErr = minErr('jqLite'); - -/** - * Converts snake_case to camelCase. - * Also there is special case for Moz prefix starting with upper case letter. - * @param name Name to normalize - */ -function camelCase(name) { - return name. - replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { - return offset ? letter.toUpperCase() : letter; - }). - replace(MOZ_HACK_REGEXP, 'Moz$1'); -} - -var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/; -var HTML_REGEXP = /<|&#?\w+;/; -var TAG_NAME_REGEXP = /<([\w:]+)/; -var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi; - -var wrapMap = { - 'option': [1, ''], - - 'thead': [1, '', '
    '], - 'col': [2, '', '
    '], - 'tr': [2, '', '
    '], - 'td': [3, '', '
    '], - '_default': [0, "", ""] -}; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function jqLiteIsTextNode(html) { - return !HTML_REGEXP.test(html); -} - -function jqLiteAcceptsData(node) { - // The window object can accept data but has no nodeType - // Otherwise we are only interested in elements (1) and documents (9) - var nodeType = node.nodeType; - return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT; -} - -function jqLiteBuildFragment(html, context) { - var tmp, tag, wrap, - fragment = context.createDocumentFragment(), - nodes = [], i; - - if (jqLiteIsTextNode(html)) { - // Convert non-html into a text node - nodes.push(context.createTextNode(html)); - } else { - // Convert html into DOM nodes - tmp = tmp || fragment.appendChild(context.createElement("div")); - tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase(); - wrap = wrapMap[tag] || wrapMap._default; - tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1>") + wrap[2]; - - // Descend through wrappers to the right content - i = wrap[0]; - while (i--) { - tmp = tmp.lastChild; - } - - nodes = concat(nodes, tmp.childNodes); - - tmp = fragment.firstChild; - tmp.textContent = ""; - } - - // Remove wrapper from fragment - fragment.textContent = ""; - fragment.innerHTML = ""; // Clear inner HTML - forEach(nodes, function(node) { - fragment.appendChild(node); - }); - - return fragment; -} - -function jqLiteParseHTML(html, context) { - context = context || document; - var parsed; - - if ((parsed = SINGLE_TAG_REGEXP.exec(html))) { - return [context.createElement(parsed[1])]; - } - - if ((parsed = jqLiteBuildFragment(html, context))) { - return parsed.childNodes; - } - - return []; -} - -///////////////////////////////////////////// -function JQLite(element) { - if (element instanceof JQLite) { - return element; - } - - var argIsString; - - if (isString(element)) { - element = trim(element); - argIsString = true; - } - if (!(this instanceof JQLite)) { - if (argIsString && element.charAt(0) != '<') { - throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element'); - } - return new JQLite(element); - } - - if (argIsString) { - jqLiteAddNodes(this, jqLiteParseHTML(element)); - } else { - jqLiteAddNodes(this, element); - } -} - -function jqLiteClone(element) { - return element.cloneNode(true); -} - -function jqLiteDealoc(element, onlyDescendants) { - if (!onlyDescendants) jqLiteRemoveData(element); - - if (element.querySelectorAll) { - var descendants = element.querySelectorAll('*'); - for (var i = 0, l = descendants.length; i < l; i++) { - jqLiteRemoveData(descendants[i]); - } - } -} - -function jqLiteOff(element, type, fn, unsupported) { - if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument'); - - var expandoStore = jqLiteExpandoStore(element); - var events = expandoStore && expandoStore.events; - var handle = expandoStore && expandoStore.handle; - - if (!handle) return; //no listeners registered - - if (!type) { - for (type in events) { - if (type !== '$destroy') { - removeEventListenerFn(element, type, handle); - } - delete events[type]; - } - } else { - forEach(type.split(' '), function(type) { - if (isDefined(fn)) { - var listenerFns = events[type]; - arrayRemove(listenerFns || [], fn); - if (listenerFns && listenerFns.length > 0) { - return; - } - } - - removeEventListenerFn(element, type, handle); - delete events[type]; - }); - } -} - -function jqLiteRemoveData(element, name) { - var expandoId = element.ng339; - var expandoStore = expandoId && jqCache[expandoId]; - - if (expandoStore) { - if (name) { - delete expandoStore.data[name]; - return; - } - - if (expandoStore.handle) { - if (expandoStore.events.$destroy) { - expandoStore.handle({}, '$destroy'); - } - jqLiteOff(element); - } - delete jqCache[expandoId]; - element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it - } -} - - -function jqLiteExpandoStore(element, createIfNecessary) { - var expandoId = element.ng339, - expandoStore = expandoId && jqCache[expandoId]; - - if (createIfNecessary && !expandoStore) { - element.ng339 = expandoId = jqNextId(); - expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined}; - } - - return expandoStore; -} - - -function jqLiteData(element, key, value) { - if (jqLiteAcceptsData(element)) { - - var isSimpleSetter = isDefined(value); - var isSimpleGetter = !isSimpleSetter && key && !isObject(key); - var massGetter = !key; - var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter); - var data = expandoStore && expandoStore.data; - - if (isSimpleSetter) { // data('key', value) - data[key] = value; - } else { - if (massGetter) { // data() - return data; - } else { - if (isSimpleGetter) { // data('key') - // don't force creation of expandoStore if it doesn't exist yet - return data && data[key]; - } else { // mass-setter: data({key1: val1, key2: val2}) - extend(data, key); - } - } - } - } -} - -function jqLiteHasClass(element, selector) { - if (!element.getAttribute) return false; - return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " "). - indexOf(" " + selector + " ") > -1); -} - -function jqLiteRemoveClass(element, cssClasses) { - if (cssClasses && element.setAttribute) { - forEach(cssClasses.split(' '), function(cssClass) { - element.setAttribute('class', trim( - (" " + (element.getAttribute('class') || '') + " ") - .replace(/[\n\t]/g, " ") - .replace(" " + trim(cssClass) + " ", " ")) - ); - }); - } -} - -function jqLiteAddClass(element, cssClasses) { - if (cssClasses && element.setAttribute) { - var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') - .replace(/[\n\t]/g, " "); - - forEach(cssClasses.split(' '), function(cssClass) { - cssClass = trim(cssClass); - if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) { - existingClasses += cssClass + ' '; - } - }); - - element.setAttribute('class', trim(existingClasses)); - } -} - - -function jqLiteAddNodes(root, elements) { - // THIS CODE IS VERY HOT. Don't make changes without benchmarking. - - if (elements) { - - // if a Node (the most common case) - if (elements.nodeType) { - root[root.length++] = elements; - } else { - var length = elements.length; - - // if an Array or NodeList and not a Window - if (typeof length === 'number' && elements.window !== elements) { - if (length) { - for (var i = 0; i < length; i++) { - root[root.length++] = elements[i]; - } - } - } else { - root[root.length++] = elements; - } - } - } -} - - -function jqLiteController(element, name) { - return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller'); -} - -function jqLiteInheritedData(element, name, value) { - // if element is the document object work with the html element instead - // this makes $(document).scope() possible - if (element.nodeType == NODE_TYPE_DOCUMENT) { - element = element.documentElement; - } - var names = isArray(name) ? name : [name]; - - while (element) { - for (var i = 0, ii = names.length; i < ii; i++) { - if ((value = jqLite.data(element, names[i])) !== undefined) return value; - } - - // If dealing with a document fragment node with a host element, and no parent, use the host - // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM - // to lookup parent controllers. - element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host); - } -} - -function jqLiteEmpty(element) { - jqLiteDealoc(element, true); - while (element.firstChild) { - element.removeChild(element.firstChild); - } -} - -function jqLiteRemove(element, keepData) { - if (!keepData) jqLiteDealoc(element); - var parent = element.parentNode; - if (parent) parent.removeChild(element); -} - - -function jqLiteDocumentLoaded(action, win) { - win = win || window; - if (win.document.readyState === 'complete') { - // Force the action to be run async for consistent behaviour - // from the action's point of view - // i.e. it will definitely not be in a $apply - win.setTimeout(action); - } else { - // No need to unbind this handler as load is only ever called once - jqLite(win).on('load', action); - } -} - -////////////////////////////////////////// -// Functions which are declared directly. -////////////////////////////////////////// -var JQLitePrototype = JQLite.prototype = { - ready: function(fn) { - var fired = false; - - function trigger() { - if (fired) return; - fired = true; - fn(); - } - - // check if document is already loaded - if (document.readyState === 'complete') { - setTimeout(trigger); - } else { - this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9 - // we can not use jqLite since we are not done loading and jQuery could be loaded later. - // jshint -W064 - JQLite(window).on('load', trigger); // fallback to window.onload for others - // jshint +W064 - } - }, - toString: function() { - var value = []; - forEach(this, function(e) { value.push('' + e);}); - return '[' + value.join(', ') + ']'; - }, - - eq: function(index) { - return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); - }, - - length: 0, - push: push, - sort: [].sort, - splice: [].splice -}; - -////////////////////////////////////////// -// Functions iterating getter/setters. -// these functions return self on setter and -// value on get. -////////////////////////////////////////// -var BOOLEAN_ATTR = {}; -forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) { - BOOLEAN_ATTR[lowercase(value)] = value; -}); -var BOOLEAN_ELEMENTS = {}; -forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { - BOOLEAN_ELEMENTS[value] = true; -}); -var ALIASED_ATTR = { - 'ngMinlength': 'minlength', - 'ngMaxlength': 'maxlength', - 'ngMin': 'min', - 'ngMax': 'max', - 'ngPattern': 'pattern' -}; - -function getBooleanAttrName(element, name) { - // check dom last since we will most likely fail on name - var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; - - // booleanAttr is here twice to minimize DOM access - return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; -} - -function getAliasedAttrName(element, name) { - var nodeName = element.nodeName; - return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name]; -} - -forEach({ - data: jqLiteData, - removeData: jqLiteRemoveData -}, function(fn, name) { - JQLite[name] = fn; -}); - -forEach({ - data: jqLiteData, - inheritedData: jqLiteInheritedData, - - scope: function(element) { - // Can't use jqLiteData here directly so we stay compatible with jQuery! - return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']); - }, - - isolateScope: function(element) { - // Can't use jqLiteData here directly so we stay compatible with jQuery! - return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate'); - }, - - controller: jqLiteController, - - injector: function(element) { - return jqLiteInheritedData(element, '$injector'); - }, - - removeAttr: function(element, name) { - element.removeAttribute(name); - }, - - hasClass: jqLiteHasClass, - - css: function(element, name, value) { - name = camelCase(name); - - if (isDefined(value)) { - element.style[name] = value; - } else { - return element.style[name]; - } - }, - - attr: function(element, name, value) { - var lowercasedName = lowercase(name); - if (BOOLEAN_ATTR[lowercasedName]) { - if (isDefined(value)) { - if (!!value) { - element[name] = true; - element.setAttribute(name, lowercasedName); - } else { - element[name] = false; - element.removeAttribute(lowercasedName); - } - } else { - return (element[name] || - (element.attributes.getNamedItem(name) || noop).specified) - ? lowercasedName - : undefined; - } - } else if (isDefined(value)) { - element.setAttribute(name, value); - } else if (element.getAttribute) { - // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code - // some elements (e.g. Document) don't have get attribute, so return undefined - var ret = element.getAttribute(name, 2); - // normalize non-existing attributes to undefined (as jQuery) - return ret === null ? undefined : ret; - } - }, - - prop: function(element, name, value) { - if (isDefined(value)) { - element[name] = value; - } else { - return element[name]; - } - }, - - text: (function() { - getText.$dv = ''; - return getText; - - function getText(element, value) { - if (isUndefined(value)) { - var nodeType = element.nodeType; - return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : ''; - } - element.textContent = value; - } - })(), - - val: function(element, value) { - if (isUndefined(value)) { - if (element.multiple && nodeName_(element) === 'select') { - var result = []; - forEach(element.options, function(option) { - if (option.selected) { - result.push(option.value || option.text); - } - }); - return result.length === 0 ? null : result; - } - return element.value; - } - element.value = value; - }, - - html: function(element, value) { - if (isUndefined(value)) { - return element.innerHTML; - } - jqLiteDealoc(element, true); - element.innerHTML = value; - }, - - empty: jqLiteEmpty -}, function(fn, name) { - /** - * Properties: writes return selection, reads return first value - */ - JQLite.prototype[name] = function(arg1, arg2) { - var i, key; - var nodeCount = this.length; - - // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it - // in a way that survives minification. - // jqLiteEmpty takes no arguments but is a setter. - if (fn !== jqLiteEmpty && - (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) { - if (isObject(arg1)) { - - // we are a write, but the object properties are the key/values - for (i = 0; i < nodeCount; i++) { - if (fn === jqLiteData) { - // data() takes the whole object in jQuery - fn(this[i], arg1); - } else { - for (key in arg1) { - fn(this[i], key, arg1[key]); - } - } - } - // return self for chaining - return this; - } else { - // we are a read, so read the first child. - // TODO: do we still need this? - var value = fn.$dv; - // Only if we have $dv do we iterate over all, otherwise it is just the first element. - var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount; - for (var j = 0; j < jj; j++) { - var nodeValue = fn(this[j], arg1, arg2); - value = value ? value + nodeValue : nodeValue; - } - return value; - } - } else { - // we are a write, so apply to all children - for (i = 0; i < nodeCount; i++) { - fn(this[i], arg1, arg2); - } - // return self for chaining - return this; - } - }; -}); - -function createEventHandler(element, events) { - var eventHandler = function(event, type) { - // jQuery specific api - event.isDefaultPrevented = function() { - return event.defaultPrevented; - }; - - var eventFns = events[type || event.type]; - var eventFnsLength = eventFns ? eventFns.length : 0; - - if (!eventFnsLength) return; - - if (isUndefined(event.immediatePropagationStopped)) { - var originalStopImmediatePropagation = event.stopImmediatePropagation; - event.stopImmediatePropagation = function() { - event.immediatePropagationStopped = true; - - if (event.stopPropagation) { - event.stopPropagation(); - } - - if (originalStopImmediatePropagation) { - originalStopImmediatePropagation.call(event); - } - }; - } - - event.isImmediatePropagationStopped = function() { - return event.immediatePropagationStopped === true; - }; - - // Copy event handlers in case event handlers array is modified during execution. - if ((eventFnsLength > 1)) { - eventFns = shallowCopy(eventFns); - } - - for (var i = 0; i < eventFnsLength; i++) { - if (!event.isImmediatePropagationStopped()) { - eventFns[i].call(element, event); - } - } - }; - - // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all - // events on `element` - eventHandler.elem = element; - return eventHandler; -} - -////////////////////////////////////////// -// Functions iterating traversal. -// These functions chain results into a single -// selector. -////////////////////////////////////////// -forEach({ - removeData: jqLiteRemoveData, - - on: function jqLiteOn(element, type, fn, unsupported) { - if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters'); - - // Do not add event handlers to non-elements because they will not be cleaned up. - if (!jqLiteAcceptsData(element)) { - return; - } - - var expandoStore = jqLiteExpandoStore(element, true); - var events = expandoStore.events; - var handle = expandoStore.handle; - - if (!handle) { - handle = expandoStore.handle = createEventHandler(element, events); - } - - // http://jsperf.com/string-indexof-vs-split - var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type]; - var i = types.length; - - while (i--) { - type = types[i]; - var eventFns = events[type]; - - if (!eventFns) { - events[type] = []; - - if (type === 'mouseenter' || type === 'mouseleave') { - // Refer to jQuery's implementation of mouseenter & mouseleave - // Read about mouseenter and mouseleave: - // http://www.quirksmode.org/js/events_mouse.html#link8 - - jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) { - var target = this, related = event.relatedTarget; - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if (!related || (related !== target && !target.contains(related))) { - handle(event, type); - } - }); - - } else { - if (type !== '$destroy') { - addEventListenerFn(element, type, handle); - } - } - eventFns = events[type]; - } - eventFns.push(fn); - } - }, - - off: jqLiteOff, - - one: function(element, type, fn) { - element = jqLite(element); - - //add the listener twice so that when it is called - //you can remove the original function and still be - //able to call element.off(ev, fn) normally - element.on(type, function onFn() { - element.off(type, fn); - element.off(type, onFn); - }); - element.on(type, fn); - }, - - replaceWith: function(element, replaceNode) { - var index, parent = element.parentNode; - jqLiteDealoc(element); - forEach(new JQLite(replaceNode), function(node) { - if (index) { - parent.insertBefore(node, index.nextSibling); - } else { - parent.replaceChild(node, element); - } - index = node; - }); - }, - - children: function(element) { - var children = []; - forEach(element.childNodes, function(element) { - if (element.nodeType === NODE_TYPE_ELEMENT) - children.push(element); - }); - return children; - }, - - contents: function(element) { - return element.contentDocument || element.childNodes || []; - }, - - append: function(element, node) { - var nodeType = element.nodeType; - if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return; - - node = new JQLite(node); - - for (var i = 0, ii = node.length; i < ii; i++) { - var child = node[i]; - element.appendChild(child); - } - }, - - prepend: function(element, node) { - if (element.nodeType === NODE_TYPE_ELEMENT) { - var index = element.firstChild; - forEach(new JQLite(node), function(child) { - element.insertBefore(child, index); - }); - } - }, - - wrap: function(element, wrapNode) { - wrapNode = jqLite(wrapNode).eq(0).clone()[0]; - var parent = element.parentNode; - if (parent) { - parent.replaceChild(wrapNode, element); - } - wrapNode.appendChild(element); - }, - - remove: jqLiteRemove, - - detach: function(element) { - jqLiteRemove(element, true); - }, - - after: function(element, newElement) { - var index = element, parent = element.parentNode; - newElement = new JQLite(newElement); - - for (var i = 0, ii = newElement.length; i < ii; i++) { - var node = newElement[i]; - parent.insertBefore(node, index.nextSibling); - index = node; - } - }, - - addClass: jqLiteAddClass, - removeClass: jqLiteRemoveClass, - - toggleClass: function(element, selector, condition) { - if (selector) { - forEach(selector.split(' '), function(className) { - var classCondition = condition; - if (isUndefined(classCondition)) { - classCondition = !jqLiteHasClass(element, className); - } - (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className); - }); - } - }, - - parent: function(element) { - var parent = element.parentNode; - return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null; - }, - - next: function(element) { - return element.nextElementSibling; - }, - - find: function(element, selector) { - if (element.getElementsByTagName) { - return element.getElementsByTagName(selector); - } else { - return []; - } - }, - - clone: jqLiteClone, - - triggerHandler: function(element, event, extraParameters) { - - var dummyEvent, eventFnsCopy, handlerArgs; - var eventName = event.type || event; - var expandoStore = jqLiteExpandoStore(element); - var events = expandoStore && expandoStore.events; - var eventFns = events && events[eventName]; - - if (eventFns) { - // Create a dummy event to pass to the handlers - dummyEvent = { - preventDefault: function() { this.defaultPrevented = true; }, - isDefaultPrevented: function() { return this.defaultPrevented === true; }, - stopImmediatePropagation: function() { this.immediatePropagationStopped = true; }, - isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; }, - stopPropagation: noop, - type: eventName, - target: element - }; - - // If a custom event was provided then extend our dummy event with it - if (event.type) { - dummyEvent = extend(dummyEvent, event); - } - - // Copy event handlers in case event handlers array is modified during execution. - eventFnsCopy = shallowCopy(eventFns); - handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent]; - - forEach(eventFnsCopy, function(fn) { - if (!dummyEvent.isImmediatePropagationStopped()) { - fn.apply(element, handlerArgs); - } - }); - } - } -}, function(fn, name) { - /** - * chaining functions - */ - JQLite.prototype[name] = function(arg1, arg2, arg3) { - var value; - - for (var i = 0, ii = this.length; i < ii; i++) { - if (isUndefined(value)) { - value = fn(this[i], arg1, arg2, arg3); - if (isDefined(value)) { - // any function which returns a value needs to be wrapped - value = jqLite(value); - } - } else { - jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3)); - } - } - return isDefined(value) ? value : this; - }; - - // bind legacy bind/unbind to on/off - JQLite.prototype.bind = JQLite.prototype.on; - JQLite.prototype.unbind = JQLite.prototype.off; -}); - - -// Provider for private $$jqLite service -function $$jqLiteProvider() { - this.$get = function $$jqLite() { - return extend(JQLite, { - hasClass: function(node, classes) { - if (node.attr) node = node[0]; - return jqLiteHasClass(node, classes); - }, - addClass: function(node, classes) { - if (node.attr) node = node[0]; - return jqLiteAddClass(node, classes); - }, - removeClass: function(node, classes) { - if (node.attr) node = node[0]; - return jqLiteRemoveClass(node, classes); - } - }); - }; -} - -/** - * Computes a hash of an 'obj'. - * Hash of a: - * string is string - * number is number as string - * object is either result of calling $$hashKey function on the object or uniquely generated id, - * that is also assigned to the $$hashKey property of the object. - * - * @param obj - * @returns {string} hash string such that the same input will have the same hash string. - * The resulting string key is in 'type:hashKey' format. - */ -function hashKey(obj, nextUidFn) { - var key = obj && obj.$$hashKey; - - if (key) { - if (typeof key === 'function') { - key = obj.$$hashKey(); - } - return key; - } - - var objType = typeof obj; - if (objType == 'function' || (objType == 'object' && obj !== null)) { - key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)(); - } else { - key = objType + ':' + obj; - } - - return key; -} - -/** - * HashMap which can use objects as keys - */ -function HashMap(array, isolatedUid) { - if (isolatedUid) { - var uid = 0; - this.nextUid = function() { - return ++uid; - }; - } - forEach(array, this.put, this); -} -HashMap.prototype = { - /** - * Store key value pair - * @param key key to store can be any type - * @param value value to store can be any type - */ - put: function(key, value) { - this[hashKey(key, this.nextUid)] = value; - }, - - /** - * @param key - * @returns {Object} the value for the key - */ - get: function(key) { - return this[hashKey(key, this.nextUid)]; - }, - - /** - * Remove the key/value pair - * @param key - */ - remove: function(key) { - var value = this[key = hashKey(key, this.nextUid)]; - delete this[key]; - return value; - } -}; - -/** - * @ngdoc function - * @module ng - * @name angular.injector - * @kind function - * - * @description - * Creates an injector object that can be used for retrieving services as well as for - * dependency injection (see {@link guide/di dependency injection}). - * - * @param {Array.} modules A list of module functions or their aliases. See - * {@link angular.module}. The `ng` module must be explicitly added. - * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which - * disallows argument name annotation inference. - * @returns {injector} Injector object. See {@link auto.$injector $injector}. - * - * @example - * Typical usage - * ```js - * // create an injector - * var $injector = angular.injector(['ng']); - * - * // use the injector to kick off your application - * // use the type inference to auto inject arguments, or use implicit injection - * $injector.invoke(function($rootScope, $compile, $document) { - * $compile($document)($rootScope); - * $rootScope.$digest(); - * }); - * ``` - * - * Sometimes you want to get access to the injector of a currently running Angular app - * from outside Angular. Perhaps, you want to inject and compile some markup after the - * application has been bootstrapped. You can do this using the extra `injector()` added - * to JQuery/jqLite elements. See {@link angular.element}. - * - * *This is fairly rare but could be the case if a third party library is injecting the - * markup.* - * - * In the following example a new block of HTML containing a `ng-controller` - * directive is added to the end of the document body by JQuery. We then compile and link - * it into the current AngularJS scope. - * - * ```js - * var $div = $('
    {{content.label}}
    '); - * $(document.body).append($div); - * - * angular.element(document).injector().invoke(function($compile) { - * var scope = angular.element($div).scope(); - * $compile($div)(scope); - * }); - * ``` - */ - - -/** - * @ngdoc module - * @name auto - * @description - * - * Implicit module which gets automatically added to each {@link auto.$injector $injector}. - */ - -var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; -var FN_ARG_SPLIT = /,/; -var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; -var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; -var $injectorMinErr = minErr('$injector'); - -function anonFn(fn) { - // For anonymous functions, showing at the very least the function signature can help in - // debugging. - var fnText = fn.toString().replace(STRIP_COMMENTS, ''), - args = fnText.match(FN_ARGS); - if (args) { - return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')'; - } - return 'fn'; -} - -function annotate(fn, strictDi, name) { - var $inject, - fnText, - argDecl, - last; - - if (typeof fn === 'function') { - if (!($inject = fn.$inject)) { - $inject = []; - if (fn.length) { - if (strictDi) { - if (!isString(name) || !name) { - name = fn.name || anonFn(fn); - } - throw $injectorMinErr('strictdi', - '{0} is not using explicit annotation and cannot be invoked in strict mode', name); - } - fnText = fn.toString().replace(STRIP_COMMENTS, ''); - argDecl = fnText.match(FN_ARGS); - forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { - arg.replace(FN_ARG, function(all, underscore, name) { - $inject.push(name); - }); - }); - } - fn.$inject = $inject; - } - } else if (isArray(fn)) { - last = fn.length - 1; - assertArgFn(fn[last], 'fn'); - $inject = fn.slice(0, last); - } else { - assertArgFn(fn, 'fn', true); - } - return $inject; -} - -/////////////////////////////////////// - -/** - * @ngdoc service - * @name $injector - * - * @description - * - * `$injector` is used to retrieve object instances as defined by - * {@link auto.$provide provider}, instantiate types, invoke methods, - * and load modules. - * - * The following always holds true: - * - * ```js - * var $injector = angular.injector(); - * expect($injector.get('$injector')).toBe($injector); - * expect($injector.invoke(function($injector) { - * return $injector; - * })).toBe($injector); - * ``` - * - * # Injection Function Annotation - * - * JavaScript does not have annotations, and annotations are needed for dependency injection. The - * following are all valid ways of annotating function with injection arguments and are equivalent. - * - * ```js - * // inferred (only works if code not minified/obfuscated) - * $injector.invoke(function(serviceA){}); - * - * // annotated - * function explicit(serviceA) {}; - * explicit.$inject = ['serviceA']; - * $injector.invoke(explicit); - * - * // inline - * $injector.invoke(['serviceA', function(serviceA){}]); - * ``` - * - * ## Inference - * - * In JavaScript calling `toString()` on a function returns the function definition. The definition - * can then be parsed and the function arguments can be extracted. This method of discovering - * annotations is disallowed when the injector is in strict mode. - * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the - * argument names. - * - * ## `$inject` Annotation - * By adding an `$inject` property onto a function the injection parameters can be specified. - * - * ## Inline - * As an array of injection names, where the last item in the array is the function to call. - */ - -/** - * @ngdoc method - * @name $injector#get - * - * @description - * Return an instance of the service. - * - * @param {string} name The name of the instance to retrieve. - * @param {string} caller An optional string to provide the origin of the function call for error messages. - * @return {*} The instance. - */ - -/** - * @ngdoc method - * @name $injector#invoke - * - * @description - * Invoke the method and supply the method arguments from the `$injector`. - * - * @param {!Function} fn The function to invoke. Function parameters are injected according to the - * {@link guide/di $inject Annotation} rules. - * @param {Object=} self The `this` for the invoked method. - * @param {Object=} locals Optional object. If preset then any argument names are read from this - * object first, before the `$injector` is consulted. - * @returns {*} the value returned by the invoked `fn` function. - */ - -/** - * @ngdoc method - * @name $injector#has - * - * @description - * Allows the user to query if the particular service exists. - * - * @param {string} name Name of the service to query. - * @returns {boolean} `true` if injector has given service. - */ - -/** - * @ngdoc method - * @name $injector#instantiate - * @description - * Create a new instance of JS type. The method takes a constructor function, invokes the new - * operator, and supplies all of the arguments to the constructor function as specified by the - * constructor annotation. - * - * @param {Function} Type Annotated constructor function. - * @param {Object=} locals Optional object. If preset then any argument names are read from this - * object first, before the `$injector` is consulted. - * @returns {Object} new instance of `Type`. - */ - -/** - * @ngdoc method - * @name $injector#annotate - * - * @description - * Returns an array of service names which the function is requesting for injection. This API is - * used by the injector to determine which services need to be injected into the function when the - * function is invoked. There are three ways in which the function can be annotated with the needed - * dependencies. - * - * # Argument names - * - * The simplest form is to extract the dependencies from the arguments of the function. This is done - * by converting the function into a string using `toString()` method and extracting the argument - * names. - * ```js - * // Given - * function MyController($scope, $route) { - * // ... - * } - * - * // Then - * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); - * ``` - * - * You can disallow this method by using strict injection mode. - * - * This method does not work with code minification / obfuscation. For this reason the following - * annotation strategies are supported. - * - * # The `$inject` property - * - * If a function has an `$inject` property and its value is an array of strings, then the strings - * represent names of services to be injected into the function. - * ```js - * // Given - * var MyController = function(obfuscatedScope, obfuscatedRoute) { - * // ... - * } - * // Define function dependencies - * MyController['$inject'] = ['$scope', '$route']; - * - * // Then - * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']); - * ``` - * - * # The array notation - * - * It is often desirable to inline Injected functions and that's when setting the `$inject` property - * is very inconvenient. In these situations using the array notation to specify the dependencies in - * a way that survives minification is a better choice: - * - * ```js - * // We wish to write this (not minification / obfuscation safe) - * injector.invoke(function($compile, $rootScope) { - * // ... - * }); - * - * // We are forced to write break inlining - * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) { - * // ... - * }; - * tmpFn.$inject = ['$compile', '$rootScope']; - * injector.invoke(tmpFn); - * - * // To better support inline function the inline annotation is supported - * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) { - * // ... - * }]); - * - * // Therefore - * expect(injector.annotate( - * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}]) - * ).toEqual(['$compile', '$rootScope']); - * ``` - * - * @param {Function|Array.} fn Function for which dependent service names need to - * be retrieved as described above. - * - * @param {boolean=} [strictDi=false] Disallow argument name annotation inference. - * - * @returns {Array.} The names of the services which the function requires. - */ - - - - -/** - * @ngdoc service - * @name $provide - * - * @description - * - * The {@link auto.$provide $provide} service has a number of methods for registering components - * with the {@link auto.$injector $injector}. Many of these functions are also exposed on - * {@link angular.Module}. - * - * An Angular **service** is a singleton object created by a **service factory**. These **service - * factories** are functions which, in turn, are created by a **service provider**. - * The **service providers** are constructor functions. When instantiated they must contain a - * property called `$get`, which holds the **service factory** function. - * - * When you request a service, the {@link auto.$injector $injector} is responsible for finding the - * correct **service provider**, instantiating it and then calling its `$get` **service factory** - * function to get the instance of the **service**. - * - * Often services have no configuration options and there is no need to add methods to the service - * provider. The provider will be no more than a constructor function with a `$get` property. For - * these cases the {@link auto.$provide $provide} service has additional helper methods to register - * services without specifying a provider. - * - * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the - * {@link auto.$injector $injector} - * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by - * providers and services. - * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by - * services, not providers. - * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`, - * that will be wrapped in a **service provider** object, whose `$get` property will contain the - * given factory function. - * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class` - * that will be wrapped in a **service provider** object, whose `$get` property will instantiate - * a new object using the given constructor function. - * - * See the individual methods for more information and examples. - */ - -/** - * @ngdoc method - * @name $provide#provider - * @description - * - * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions - * are constructor functions, whose instances are responsible for "providing" a factory for a - * service. - * - * Service provider names start with the name of the service they provide followed by `Provider`. - * For example, the {@link ng.$log $log} service has a provider called - * {@link ng.$logProvider $logProvider}. - * - * Service provider objects can have additional methods which allow configuration of the provider - * and its service. Importantly, you can configure what kind of service is created by the `$get` - * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a - * method {@link ng.$logProvider#debugEnabled debugEnabled} - * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the - * console or not. - * - * @param {string} name The name of the instance. NOTE: the provider will be available under `name + - 'Provider'` key. - * @param {(Object|function())} provider If the provider is: - * - * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using - * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created. - * - `Constructor`: a new instance of the provider will be created using - * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`. - * - * @returns {Object} registered provider instance - - * @example - * - * The following example shows how to create a simple event tracking service and register it using - * {@link auto.$provide#provider $provide.provider()}. - * - * ```js - * // Define the eventTracker provider - * function EventTrackerProvider() { - * var trackingUrl = '/track'; - * - * // A provider method for configuring where the tracked events should been saved - * this.setTrackingUrl = function(url) { - * trackingUrl = url; - * }; - * - * // The service factory function - * this.$get = ['$http', function($http) { - * var trackedEvents = {}; - * return { - * // Call this to track an event - * event: function(event) { - * var count = trackedEvents[event] || 0; - * count += 1; - * trackedEvents[event] = count; - * return count; - * }, - * // Call this to save the tracked events to the trackingUrl - * save: function() { - * $http.post(trackingUrl, trackedEvents); - * } - * }; - * }]; - * } - * - * describe('eventTracker', function() { - * var postSpy; - * - * beforeEach(module(function($provide) { - * // Register the eventTracker provider - * $provide.provider('eventTracker', EventTrackerProvider); - * })); - * - * beforeEach(module(function(eventTrackerProvider) { - * // Configure eventTracker provider - * eventTrackerProvider.setTrackingUrl('/custom-track'); - * })); - * - * it('tracks events', inject(function(eventTracker) { - * expect(eventTracker.event('login')).toEqual(1); - * expect(eventTracker.event('login')).toEqual(2); - * })); - * - * it('saves to the tracking url', inject(function(eventTracker, $http) { - * postSpy = spyOn($http, 'post'); - * eventTracker.event('login'); - * eventTracker.save(); - * expect(postSpy).toHaveBeenCalled(); - * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track'); - * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track'); - * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 }); - * })); - * }); - * ``` - */ - -/** - * @ngdoc method - * @name $provide#factory - * @description - * - * Register a **service factory**, which will be called to return the service instance. - * This is short for registering a service where its provider consists of only a `$get` property, - * which is the given service factory function. - * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to - * configure your service in a provider. - * - * @param {string} name The name of the instance. - * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand - * for `$provide.provider(name, {$get: $getFn})`. - * @returns {Object} registered provider instance - * - * @example - * Here is an example of registering a service - * ```js - * $provide.factory('ping', ['$http', function($http) { - * return function ping() { - * return $http.send('/ping'); - * }; - * }]); - * ``` - * You would then inject and use this service like this: - * ```js - * someModule.controller('Ctrl', ['ping', function(ping) { - * ping(); - * }]); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#service - * @description - * - * Register a **service constructor**, which will be invoked with `new` to create the service - * instance. - * This is short for registering a service where its provider's `$get` property is the service - * constructor function that will be used to instantiate the service instance. - * - * You should use {@link auto.$provide#service $provide.service(class)} if you define your service - * as a type/class. - * - * @param {string} name The name of the instance. - * @param {Function} constructor A class (constructor function) that will be instantiated. - * @returns {Object} registered provider instance - * - * @example - * Here is an example of registering a service using - * {@link auto.$provide#service $provide.service(class)}. - * ```js - * var Ping = function($http) { - * this.$http = $http; - * }; - * - * Ping.$inject = ['$http']; - * - * Ping.prototype.send = function() { - * return this.$http.get('/ping'); - * }; - * $provide.service('ping', Ping); - * ``` - * You would then inject and use this service like this: - * ```js - * someModule.controller('Ctrl', ['ping', function(ping) { - * ping.send(); - * }]); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#value - * @description - * - * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a - * number, an array, an object or a function. This is short for registering a service where its - * provider's `$get` property is a factory function that takes no arguments and returns the **value - * service**. - * - * Value services are similar to constant services, except that they cannot be injected into a - * module configuration function (see {@link angular.Module#config}) but they can be overridden by - * an Angular - * {@link auto.$provide#decorator decorator}. - * - * @param {string} name The name of the instance. - * @param {*} value The value. - * @returns {Object} registered provider instance - * - * @example - * Here are some examples of creating value services. - * ```js - * $provide.value('ADMIN_USER', 'admin'); - * - * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 }); - * - * $provide.value('halfOf', function(value) { - * return value / 2; - * }); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#constant - * @description - * - * Register a **constant service**, such as a string, a number, an array, an object or a function, - * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be - * injected into a module configuration function (see {@link angular.Module#config}) and it cannot - * be overridden by an Angular {@link auto.$provide#decorator decorator}. - * - * @param {string} name The name of the constant. - * @param {*} value The constant value. - * @returns {Object} registered instance - * - * @example - * Here a some examples of creating constants: - * ```js - * $provide.constant('SHARD_HEIGHT', 306); - * - * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']); - * - * $provide.constant('double', function(value) { - * return value * 2; - * }); - * ``` - */ - - -/** - * @ngdoc method - * @name $provide#decorator - * @description - * - * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator - * intercepts the creation of a service, allowing it to override or modify the behaviour of the - * service. The object returned by the decorator may be the original service, or a new service - * object which replaces or wraps and delegates to the original service. - * - * @param {string} name The name of the service to decorate. - * @param {function()} decorator This function will be invoked when the service needs to be - * instantiated and should return the decorated service instance. The function is called using - * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable. - * Local injection arguments: - * - * * `$delegate` - The original service instance, which can be monkey patched, configured, - * decorated or delegated to. - * - * @example - * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting - * calls to {@link ng.$log#error $log.warn()}. - * ```js - * $provide.decorator('$log', ['$delegate', function($delegate) { - * $delegate.warn = $delegate.error; - * return $delegate; - * }]); - * ``` - */ - - -function createInjector(modulesToLoad, strictDi) { - strictDi = (strictDi === true); - var INSTANTIATING = {}, - providerSuffix = 'Provider', - path = [], - loadedModules = new HashMap([], true), - providerCache = { - $provide: { - provider: supportObject(provider), - factory: supportObject(factory), - service: supportObject(service), - value: supportObject(value), - constant: supportObject(constant), - decorator: decorator - } - }, - providerInjector = (providerCache.$injector = - createInternalInjector(providerCache, function(serviceName, caller) { - if (angular.isString(caller)) { - path.push(caller); - } - throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- ')); - })), - instanceCache = {}, - instanceInjector = (instanceCache.$injector = - createInternalInjector(instanceCache, function(serviceName, caller) { - var provider = providerInjector.get(serviceName + providerSuffix, caller); - return instanceInjector.invoke(provider.$get, provider, undefined, serviceName); - })); - - - forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); - - return instanceInjector; - - //////////////////////////////////// - // $provider - //////////////////////////////////// - - function supportObject(delegate) { - return function(key, value) { - if (isObject(key)) { - forEach(key, reverseParams(delegate)); - } else { - return delegate(key, value); - } - }; - } - - function provider(name, provider_) { - assertNotHasOwnProperty(name, 'service'); - if (isFunction(provider_) || isArray(provider_)) { - provider_ = providerInjector.instantiate(provider_); - } - if (!provider_.$get) { - throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); - } - return providerCache[name + providerSuffix] = provider_; - } - - function enforceReturnValue(name, factory) { - return function enforcedReturnValue() { - var result = instanceInjector.invoke(factory, this); - if (isUndefined(result)) { - throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); - } - return result; - }; - } - - function factory(name, factoryFn, enforce) { - return provider(name, { - $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn - }); - } - - function service(name, constructor) { - return factory(name, ['$injector', function($injector) { - return $injector.instantiate(constructor); - }]); - } - - function value(name, val) { return factory(name, valueFn(val), false); } - - function constant(name, value) { - assertNotHasOwnProperty(name, 'constant'); - providerCache[name] = value; - instanceCache[name] = value; - } - - function decorator(serviceName, decorFn) { - var origProvider = providerInjector.get(serviceName + providerSuffix), - orig$get = origProvider.$get; - - origProvider.$get = function() { - var origInstance = instanceInjector.invoke(orig$get, origProvider); - return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); - }; - } - - //////////////////////////////////// - // Module Loading - //////////////////////////////////// - function loadModules(modulesToLoad) { - var runBlocks = [], moduleFn; - forEach(modulesToLoad, function(module) { - if (loadedModules.get(module)) return; - loadedModules.put(module, true); - - function runInvokeQueue(queue) { - var i, ii; - for (i = 0, ii = queue.length; i < ii; i++) { - var invokeArgs = queue[i], - provider = providerInjector.get(invokeArgs[0]); - - provider[invokeArgs[1]].apply(provider, invokeArgs[2]); - } - } - - try { - if (isString(module)) { - moduleFn = angularModule(module); - runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); - runInvokeQueue(moduleFn._invokeQueue); - runInvokeQueue(moduleFn._configBlocks); - } else if (isFunction(module)) { - runBlocks.push(providerInjector.invoke(module)); - } else if (isArray(module)) { - runBlocks.push(providerInjector.invoke(module)); - } else { - assertArgFn(module, 'module'); - } - } catch (e) { - if (isArray(module)) { - module = module[module.length - 1]; - } - if (e.message && e.stack && e.stack.indexOf(e.message) == -1) { - // Safari & FF's stack traces don't contain error.message content - // unlike those of Chrome and IE - // So if stack doesn't contain message, we create a new string that contains both. - // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here. - /* jshint -W022 */ - e = e.message + '\n' + e.stack; - } - throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}", - module, e.stack || e.message || e); - } - }); - return runBlocks; - } - - //////////////////////////////////// - // internal Injector - //////////////////////////////////// - - function createInternalInjector(cache, factory) { - - function getService(serviceName, caller) { - if (cache.hasOwnProperty(serviceName)) { - if (cache[serviceName] === INSTANTIATING) { - throw $injectorMinErr('cdep', 'Circular dependency found: {0}', - serviceName + ' <- ' + path.join(' <- ')); - } - return cache[serviceName]; - } else { - try { - path.unshift(serviceName); - cache[serviceName] = INSTANTIATING; - return cache[serviceName] = factory(serviceName, caller); - } catch (err) { - if (cache[serviceName] === INSTANTIATING) { - delete cache[serviceName]; - } - throw err; - } finally { - path.shift(); - } - } - } - - function invoke(fn, self, locals, serviceName) { - if (typeof locals === 'string') { - serviceName = locals; - locals = null; - } - - var args = [], - $inject = createInjector.$$annotate(fn, strictDi, serviceName), - length, i, - key; - - for (i = 0, length = $inject.length; i < length; i++) { - key = $inject[i]; - if (typeof key !== 'string') { - throw $injectorMinErr('itkn', - 'Incorrect injection token! Expected service name as string, got {0}', key); - } - args.push( - locals && locals.hasOwnProperty(key) - ? locals[key] - : getService(key, serviceName) - ); - } - if (isArray(fn)) { - fn = fn[length]; - } - - // http://jsperf.com/angularjs-invoke-apply-vs-switch - // #5388 - return fn.apply(self, args); - } - - function instantiate(Type, locals, serviceName) { - // Check if Type is annotated and use just the given function at n-1 as parameter - // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]); - // Object creation: http://jsperf.com/create-constructor/2 - var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype || null); - var returnedValue = invoke(Type, instance, locals, serviceName); - - return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance; - } - - return { - invoke: invoke, - instantiate: instantiate, - get: getService, - annotate: createInjector.$$annotate, - has: function(name) { - return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name); - } - }; - } -} - -createInjector.$$annotate = annotate; - -/** - * @ngdoc provider - * @name $anchorScrollProvider - * - * @description - * Use `$anchorScrollProvider` to disable automatic scrolling whenever - * {@link ng.$location#hash $location.hash()} changes. - */ -function $AnchorScrollProvider() { - - var autoScrollingEnabled = true; - - /** - * @ngdoc method - * @name $anchorScrollProvider#disableAutoScrolling - * - * @description - * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to - * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.
    - * Use this method to disable automatic scrolling. - * - * If automatic scrolling is disabled, one must explicitly call - * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the - * current hash. - */ - this.disableAutoScrolling = function() { - autoScrollingEnabled = false; - }; - - /** - * @ngdoc service - * @name $anchorScroll - * @kind function - * @requires $window - * @requires $location - * @requires $rootScope - * - * @description - * When called, it checks the current value of {@link ng.$location#hash $location.hash()} and - * scrolls to the related element, according to the rules specified in the - * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document). - * - * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to - * match any anchor whenever it changes. This can be disabled by calling - * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}. - * - * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a - * vertical scroll-offset (either fixed or dynamic). - * - * @property {(number|function|jqLite)} yOffset - * If set, specifies a vertical scroll-offset. This is often useful when there are fixed - * positioned elements at the top of the page, such as navbars, headers etc. - * - * `yOffset` can be specified in various ways: - * - **number**: A fixed number of pixels to be used as offset.

    - * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return - * a number representing the offset (in pixels).

    - * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from - * the top of the page to the element's bottom will be used as offset.
    - * **Note**: The element will be taken into account only as long as its `position` is set to - * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust - * their height and/or positioning according to the viewport's size. - * - *
    - *
    - * In order for `yOffset` to work properly, scrolling should take place on the document's root and - * not some child element. - *
    - * - * @example - - -
    - Go to bottom - You're at the bottom! -
    -
    - - angular.module('anchorScrollExample', []) - .controller('ScrollController', ['$scope', '$location', '$anchorScroll', - function ($scope, $location, $anchorScroll) { - $scope.gotoBottom = function() { - // set the location.hash to the id of - // the element you wish to scroll to. - $location.hash('bottom'); - - // call $anchorScroll() - $anchorScroll(); - }; - }]); - - - #scrollArea { - height: 280px; - overflow: auto; - } - - #bottom { - display: block; - margin-top: 2000px; - } - -
    - * - *
    - * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value). - * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details. - * - * @example - - - -
    - Anchor {{x}} of 5 -
    -
    - - angular.module('anchorScrollOffsetExample', []) - .run(['$anchorScroll', function($anchorScroll) { - $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels - }]) - .controller('headerCtrl', ['$anchorScroll', '$location', '$scope', - function ($anchorScroll, $location, $scope) { - $scope.gotoAnchor = function(x) { - var newHash = 'anchor' + x; - if ($location.hash() !== newHash) { - // set the $location.hash to `newHash` and - // $anchorScroll will automatically scroll to it - $location.hash('anchor' + x); - } else { - // call $anchorScroll() explicitly, - // since $location.hash hasn't changed - $anchorScroll(); - } - }; - } - ]); - - - body { - padding-top: 50px; - } - - .anchor { - border: 2px dashed DarkOrchid; - padding: 10px 10px 200px 10px; - } - - .fixed-header { - background-color: rgba(0, 0, 0, 0.2); - height: 50px; - position: fixed; - top: 0; left: 0; right: 0; - } - - .fixed-header > a { - display: inline-block; - margin: 5px 15px; - } - -
    - */ - this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { - var document = $window.document; - - // Helper function to get first anchor from a NodeList - // (using `Array#some()` instead of `angular#forEach()` since it's more performant - // and working in all supported browsers.) - function getFirstAnchor(list) { - var result = null; - Array.prototype.some.call(list, function(element) { - if (nodeName_(element) === 'a') { - result = element; - return true; - } - }); - return result; - } - - function getYOffset() { - - var offset = scroll.yOffset; - - if (isFunction(offset)) { - offset = offset(); - } else if (isElement(offset)) { - var elem = offset[0]; - var style = $window.getComputedStyle(elem); - if (style.position !== 'fixed') { - offset = 0; - } else { - offset = elem.getBoundingClientRect().bottom; - } - } else if (!isNumber(offset)) { - offset = 0; - } - - return offset; - } - - function scrollTo(elem) { - if (elem) { - elem.scrollIntoView(); - - var offset = getYOffset(); - - if (offset) { - // `offset` is the number of pixels we should scroll UP in order to align `elem` properly. - // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the - // top of the viewport. - // - // IF the number of pixels from the top of `elem` to the end of the page's content is less - // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some - // way down the page. - // - // This is often the case for elements near the bottom of the page. - // - // In such cases we do not need to scroll the whole `offset` up, just the difference between - // the top of the element and the offset, which is enough to align the top of `elem` at the - // desired position. - var elemTop = elem.getBoundingClientRect().top; - $window.scrollBy(0, elemTop - offset); - } - } else { - $window.scrollTo(0, 0); - } - } - - function scroll() { - var hash = $location.hash(), elm; - - // empty hash, scroll to the top of the page - if (!hash) scrollTo(null); - - // element with given id - else if ((elm = document.getElementById(hash))) scrollTo(elm); - - // first anchor with given name :-D - else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm); - - // no element and hash == 'top', scroll to the top of the page - else if (hash === 'top') scrollTo(null); - } - - // does not scroll when user clicks on anchor link that is currently on - // (no url change, no $location.hash() change), browser native does scroll - if (autoScrollingEnabled) { - $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, - function autoScrollWatchAction(newVal, oldVal) { - // skip the initial scroll if $location.hash is empty - if (newVal === oldVal && newVal === '') return; - - jqLiteDocumentLoaded(function() { - $rootScope.$evalAsync(scroll); - }); - }); - } - - return scroll; - }]; -} - -var $animateMinErr = minErr('$animate'); - -/** - * @ngdoc provider - * @name $animateProvider - * - * @description - * Default implementation of $animate that doesn't perform any animations, instead just - * synchronously performs DOM - * updates and calls done() callbacks. - * - * In order to enable animations the ngAnimate module has to be loaded. - * - * To see the functional implementation check out src/ngAnimate/animate.js - */ -var $AnimateProvider = ['$provide', function($provide) { - - - this.$$selectors = {}; - - - /** - * @ngdoc method - * @name $animateProvider#register - * - * @description - * Registers a new injectable animation factory function. The factory function produces the - * animation object which contains callback functions for each event that is expected to be - * animated. - * - * * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction` - * must be called once the element animation is complete. If a function is returned then the - * animation service will use this function to cancel the animation whenever a cancel event is - * triggered. - * - * - * ```js - * return { - * eventFn : function(element, done) { - * //code to run the animation - * //once complete, then run done() - * return function cancellationFunction() { - * //code to cancel the animation - * } - * } - * } - * ``` - * - * @param {string} name The name of the animation. - * @param {Function} factory The factory function that will be executed to return the animation - * object. - */ - this.register = function(name, factory) { - var key = name + '-animation'; - if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel', - "Expecting class selector starting with '.' got '{0}'.", name); - this.$$selectors[name.substr(1)] = key; - $provide.factory(key, factory); - }; - - /** - * @ngdoc method - * @name $animateProvider#classNameFilter - * - * @description - * Sets and/or returns the CSS class regular expression that is checked when performing - * an animation. Upon bootstrap the classNameFilter value is not set at all and will - * therefore enable $animate to attempt to perform an animation on any element. - * When setting the classNameFilter value, animations will only be performed on elements - * that successfully match the filter expression. This in turn can boost performance - * for low-powered devices as well as applications containing a lot of structural operations. - * @param {RegExp=} expression The className expression which will be checked against all animations - * @return {RegExp} The current CSS className expression value. If null then there is no expression value - */ - this.classNameFilter = function(expression) { - if (arguments.length === 1) { - this.$$classNameFilter = (expression instanceof RegExp) ? expression : null; - } - return this.$$classNameFilter; - }; - - this.$get = ['$$q', '$$asyncCallback', '$rootScope', function($$q, $$asyncCallback, $rootScope) { - - var currentDefer; - - function runAnimationPostDigest(fn) { - var cancelFn, defer = $$q.defer(); - defer.promise.$$cancelFn = function ngAnimateMaybeCancel() { - cancelFn && cancelFn(); - }; - - $rootScope.$$postDigest(function ngAnimatePostDigest() { - cancelFn = fn(function ngAnimateNotifyComplete() { - defer.resolve(); - }); - }); - - return defer.promise; - } - - function resolveElementClasses(element, classes) { - var toAdd = [], toRemove = []; - - var hasClasses = createMap(); - forEach((element.attr('class') || '').split(/\s+/), function(className) { - hasClasses[className] = true; - }); - - forEach(classes, function(status, className) { - var hasClass = hasClasses[className]; - - // If the most recent class manipulation (via $animate) was to remove the class, and the - // element currently has the class, the class is scheduled for removal. Otherwise, if - // the most recent class manipulation (via $animate) was to add the class, and the - // element does not currently have the class, the class is scheduled to be added. - if (status === false && hasClass) { - toRemove.push(className); - } else if (status === true && !hasClass) { - toAdd.push(className); - } - }); - - return (toAdd.length + toRemove.length) > 0 && - [toAdd.length ? toAdd : null, toRemove.length ? toRemove : null]; - } - - function cachedClassManipulation(cache, classes, op) { - for (var i=0, ii = classes.length; i < ii; ++i) { - var className = classes[i]; - cache[className] = op; - } - } - - function asyncPromise() { - // only serve one instance of a promise in order to save CPU cycles - if (!currentDefer) { - currentDefer = $$q.defer(); - $$asyncCallback(function() { - currentDefer.resolve(); - currentDefer = null; - }); - } - return currentDefer.promise; - } - - function applyStyles(element, options) { - if (angular.isObject(options)) { - var styles = extend(options.from || {}, options.to || {}); - element.css(styles); - } - } - - /** - * - * @ngdoc service - * @name $animate - * @description The $animate service provides rudimentary DOM manipulation functions to - * insert, remove and move elements within the DOM, as well as adding and removing classes. - * This service is the core service used by the ngAnimate $animator service which provides - * high-level animation hooks for CSS and JavaScript. - * - * $animate is available in the AngularJS core, however, the ngAnimate module must be included - * to enable full out animation support. Otherwise, $animate will only perform simple DOM - * manipulation operations. - * - * To learn more about enabling animation support, click here to visit the {@link ngAnimate - * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service - * page}. - */ - return { - animate: function(element, from, to) { - applyStyles(element, { from: from, to: to }); - return asyncPromise(); - }, - - /** - * - * @ngdoc method - * @name $animate#enter - * @kind function - * @description Inserts the element into the DOM either after the `after` element or - * as the first child within the `parent` element. When the function is called a promise - * is returned that will be resolved at a later time. - * @param {DOMElement} element the element which will be inserted into the DOM - * @param {DOMElement} parent the parent element which will append the element as - * a child (if the after element is not present) - * @param {DOMElement} after the sibling element which will append the element - * after itself - * @param {object=} options an optional collection of styles that will be applied to the element. - * @return {Promise} the animation callback promise - */ - enter: function(element, parent, after, options) { - applyStyles(element, options); - after ? after.after(element) - : parent.prepend(element); - return asyncPromise(); - }, - - /** - * - * @ngdoc method - * @name $animate#leave - * @kind function - * @description Removes the element from the DOM. When the function is called a promise - * is returned that will be resolved at a later time. - * @param {DOMElement} element the element which will be removed from the DOM - * @param {object=} options an optional collection of options that will be applied to the element. - * @return {Promise} the animation callback promise - */ - leave: function(element, options) { - element.remove(); - return asyncPromise(); - }, - - /** - * - * @ngdoc method - * @name $animate#move - * @kind function - * @description Moves the position of the provided element within the DOM to be placed - * either after the `after` element or inside of the `parent` element. When the function - * is called a promise is returned that will be resolved at a later time. - * - * @param {DOMElement} element the element which will be moved around within the - * DOM - * @param {DOMElement} parent the parent element where the element will be - * inserted into (if the after element is not present) - * @param {DOMElement} after the sibling element where the element will be - * positioned next to - * @param {object=} options an optional collection of options that will be applied to the element. - * @return {Promise} the animation callback promise - */ - move: function(element, parent, after, options) { - // Do not remove element before insert. Removing will cause data associated with the - // element to be dropped. Insert will implicitly do the remove. - return this.enter(element, parent, after, options); - }, - - /** - * - * @ngdoc method - * @name $animate#addClass - * @kind function - * @description Adds the provided className CSS class value to the provided element. - * When the function is called a promise is returned that will be resolved at a later time. - * @param {DOMElement} element the element which will have the className value - * added to it - * @param {string} className the CSS class which will be added to the element - * @param {object=} options an optional collection of options that will be applied to the element. - * @return {Promise} the animation callback promise - */ - addClass: function(element, className, options) { - return this.setClass(element, className, [], options); - }, - - $$addClassImmediately: function(element, className, options) { - element = jqLite(element); - className = !isString(className) - ? (isArray(className) ? className.join(' ') : '') - : className; - forEach(element, function(element) { - jqLiteAddClass(element, className); - }); - applyStyles(element, options); - return asyncPromise(); - }, - - /** - * - * @ngdoc method - * @name $animate#removeClass - * @kind function - * @description Removes the provided className CSS class value from the provided element. - * When the function is called a promise is returned that will be resolved at a later time. - * @param {DOMElement} element the element which will have the className value - * removed from it - * @param {string} className the CSS class which will be removed from the element - * @param {object=} options an optional collection of options that will be applied to the element. - * @return {Promise} the animation callback promise - */ - removeClass: function(element, className, options) { - return this.setClass(element, [], className, options); - }, - - $$removeClassImmediately: function(element, className, options) { - element = jqLite(element); - className = !isString(className) - ? (isArray(className) ? className.join(' ') : '') - : className; - forEach(element, function(element) { - jqLiteRemoveClass(element, className); - }); - applyStyles(element, options); - return asyncPromise(); - }, - - /** - * - * @ngdoc method - * @name $animate#setClass - * @kind function - * @description Adds and/or removes the given CSS classes to and from the element. - * When the function is called a promise is returned that will be resolved at a later time. - * @param {DOMElement} element the element which will have its CSS classes changed - * removed from it - * @param {string} add the CSS classes which will be added to the element - * @param {string} remove the CSS class which will be removed from the element - * @param {object=} options an optional collection of options that will be applied to the element. - * @return {Promise} the animation callback promise - */ - setClass: function(element, add, remove, options) { - var self = this; - var STORAGE_KEY = '$$animateClasses'; - var createdCache = false; - element = jqLite(element); - - var cache = element.data(STORAGE_KEY); - if (!cache) { - cache = { - classes: {}, - options: options - }; - createdCache = true; - } else if (options && cache.options) { - cache.options = angular.extend(cache.options || {}, options); - } - - var classes = cache.classes; - - add = isArray(add) ? add : add.split(' '); - remove = isArray(remove) ? remove : remove.split(' '); - cachedClassManipulation(classes, add, true); - cachedClassManipulation(classes, remove, false); - - if (createdCache) { - cache.promise = runAnimationPostDigest(function(done) { - var cache = element.data(STORAGE_KEY); - element.removeData(STORAGE_KEY); - - // in the event that the element is removed before postDigest - // is run then the cache will be undefined and there will be - // no need anymore to add or remove and of the element classes - if (cache) { - var classes = resolveElementClasses(element, cache.classes); - if (classes) { - self.$$setClassImmediately(element, classes[0], classes[1], cache.options); - } - } - - done(); - }); - element.data(STORAGE_KEY, cache); - } - - return cache.promise; - }, - - $$setClassImmediately: function(element, add, remove, options) { - add && this.$$addClassImmediately(element, add); - remove && this.$$removeClassImmediately(element, remove); - applyStyles(element, options); - return asyncPromise(); - }, - - enabled: noop, - cancel: noop - }; - }]; -}]; - -function $$AsyncCallbackProvider() { - this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) { - return $$rAF.supported - ? function(fn) { return $$rAF(fn); } - : function(fn) { - return $timeout(fn, 0, false); - }; - }]; -} - -/* global stripHash: true */ - -/** - * ! This is a private undocumented service ! - * - * @name $browser - * @requires $log - * @description - * This object has two goals: - * - * - hide all the global state in the browser caused by the window object - * - abstract away all the browser specific features and inconsistencies - * - * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` - * service, which can be used for convenient testing of the application without the interaction with - * the real browser apis. - */ -/** - * @param {object} window The global window object. - * @param {object} document jQuery wrapped document. - * @param {object} $log window.console or an object with the same interface. - * @param {object} $sniffer $sniffer service - */ -function Browser(window, document, $log, $sniffer) { - var self = this, - rawDocument = document[0], - location = window.location, - history = window.history, - setTimeout = window.setTimeout, - clearTimeout = window.clearTimeout, - pendingDeferIds = {}; - - self.isMock = false; - - var outstandingRequestCount = 0; - var outstandingRequestCallbacks = []; - - // TODO(vojta): remove this temporary api - self.$$completeOutstandingRequest = completeOutstandingRequest; - self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; - - /** - * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` - * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. - */ - function completeOutstandingRequest(fn) { - try { - fn.apply(null, sliceArgs(arguments, 1)); - } finally { - outstandingRequestCount--; - if (outstandingRequestCount === 0) { - while (outstandingRequestCallbacks.length) { - try { - outstandingRequestCallbacks.pop()(); - } catch (e) { - $log.error(e); - } - } - } - } - } - - function getHash(url) { - var index = url.indexOf('#'); - return index === -1 ? '' : url.substr(index + 1); - } - - /** - * @private - * Note: this method is used only by scenario runner - * TODO(vojta): prefix this method with $$ ? - * @param {function()} callback Function that will be called when no outstanding request - */ - self.notifyWhenNoOutstandingRequests = function(callback) { - // force browser to execute all pollFns - this is needed so that cookies and other pollers fire - // at some deterministic time in respect to the test runner's actions. Leaving things up to the - // regular poller would result in flaky tests. - forEach(pollFns, function(pollFn) { pollFn(); }); - - if (outstandingRequestCount === 0) { - callback(); - } else { - outstandingRequestCallbacks.push(callback); - } - }; - - ////////////////////////////////////////////////////////////// - // Poll Watcher API - ////////////////////////////////////////////////////////////// - var pollFns = [], - pollTimeout; - - /** - * @name $browser#addPollFn - * - * @param {function()} fn Poll function to add - * - * @description - * Adds a function to the list of functions that poller periodically executes, - * and starts polling if not started yet. - * - * @returns {function()} the added function - */ - self.addPollFn = function(fn) { - if (isUndefined(pollTimeout)) startPoller(100, setTimeout); - pollFns.push(fn); - return fn; - }; - - /** - * @param {number} interval How often should browser call poll functions (ms) - * @param {function()} setTimeout Reference to a real or fake `setTimeout` function. - * - * @description - * Configures the poller to run in the specified intervals, using the specified - * setTimeout fn and kicks it off. - */ - function startPoller(interval, setTimeout) { - (function check() { - forEach(pollFns, function(pollFn) { pollFn(); }); - pollTimeout = setTimeout(check, interval); - })(); - } - - ////////////////////////////////////////////////////////////// - // URL API - ////////////////////////////////////////////////////////////// - - var cachedState, lastHistoryState, - lastBrowserUrl = location.href, - baseElement = document.find('base'), - reloadLocation = null; - - cacheState(); - lastHistoryState = cachedState; - - /** - * @name $browser#url - * - * @description - * GETTER: - * Without any argument, this method just returns current value of location.href. - * - * SETTER: - * With at least one argument, this method sets url to new value. - * If html5 history api supported, pushState/replaceState is used, otherwise - * location.href/location.replace is used. - * Returns its own instance to allow chaining - * - * NOTE: this api is intended for use only by the $location service. Please use the - * {@link ng.$location $location service} to change url. - * - * @param {string} url New url (when used as setter) - * @param {boolean=} replace Should new url replace current history record? - * @param {object=} state object to use with pushState/replaceState - */ - self.url = function(url, replace, state) { - // In modern browsers `history.state` is `null` by default; treating it separately - // from `undefined` would cause `$browser.url('/foo')` to change `history.state` - // to undefined via `pushState`. Instead, let's change `undefined` to `null` here. - if (isUndefined(state)) { - state = null; - } - - // Android Browser BFCache causes location, history reference to become stale. - if (location !== window.location) location = window.location; - if (history !== window.history) history = window.history; - - // setter - if (url) { - var sameState = lastHistoryState === state; - - // Don't change anything if previous and current URLs and states match. This also prevents - // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode. - // See https://github.com/angular/angular.js/commit/ffb2701 - if (lastBrowserUrl === url && (!$sniffer.history || sameState)) { - return self; - } - var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url); - lastBrowserUrl = url; - lastHistoryState = state; - // Don't use history API if only the hash changed - // due to a bug in IE10/IE11 which leads - // to not firing a `hashchange` nor `popstate` event - // in some cases (see #9143). - if ($sniffer.history && (!sameBase || !sameState)) { - history[replace ? 'replaceState' : 'pushState'](state, '', url); - cacheState(); - // Do the assignment again so that those two variables are referentially identical. - lastHistoryState = cachedState; - } else { - if (!sameBase) { - reloadLocation = url; - } - if (replace) { - location.replace(url); - } else if (!sameBase) { - location.href = url; - } else { - location.hash = getHash(url); - } - } - return self; - // getter - } else { - // - reloadLocation is needed as browsers don't allow to read out - // the new location.href if a reload happened. - // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 - return reloadLocation || location.href.replace(/%27/g,"'"); - } - }; - - /** - * @name $browser#state - * - * @description - * This method is a getter. - * - * Return history.state or null if history.state is undefined. - * - * @returns {object} state - */ - self.state = function() { - return cachedState; - }; - - var urlChangeListeners = [], - urlChangeInit = false; - - function cacheStateAndFireUrlChange() { - cacheState(); - fireUrlChange(); - } - - // This variable should be used *only* inside the cacheState function. - var lastCachedState = null; - function cacheState() { - // This should be the only place in $browser where `history.state` is read. - cachedState = window.history.state; - cachedState = isUndefined(cachedState) ? null : cachedState; - - // Prevent callbacks fo fire twice if both hashchange & popstate were fired. - if (equals(cachedState, lastCachedState)) { - cachedState = lastCachedState; - } - lastCachedState = cachedState; - } - - function fireUrlChange() { - if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) { - return; - } - - lastBrowserUrl = self.url(); - lastHistoryState = cachedState; - forEach(urlChangeListeners, function(listener) { - listener(self.url(), cachedState); - }); - } - - /** - * @name $browser#onUrlChange - * - * @description - * Register callback function that will be called, when url changes. - * - * It's only called when the url is changed from outside of angular: - * - user types different url into address bar - * - user clicks on history (forward/back) button - * - user clicks on a link - * - * It's not called when url is changed by $browser.url() method - * - * The listener gets called with new url as parameter. - * - * NOTE: this api is intended for use only by the $location service. Please use the - * {@link ng.$location $location service} to monitor url changes in angular apps. - * - * @param {function(string)} listener Listener function to be called when url changes. - * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. - */ - self.onUrlChange = function(callback) { - // TODO(vojta): refactor to use node's syntax for events - if (!urlChangeInit) { - // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) - // don't fire popstate when user change the address bar and don't fire hashchange when url - // changed by push/replaceState - - // html5 history api - popstate event - if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange); - // hashchange event - jqLite(window).on('hashchange', cacheStateAndFireUrlChange); - - urlChangeInit = true; - } - - urlChangeListeners.push(callback); - return callback; - }; - - /** - * Checks whether the url has changed outside of Angular. - * Needs to be exported to be able to check for changes that have been done in sync, - * as hashchange/popstate events fire in async. - */ - self.$$checkUrlChange = fireUrlChange; - - ////////////////////////////////////////////////////////////// - // Misc API - ////////////////////////////////////////////////////////////// - - /** - * @name $browser#baseHref - * - * @description - * Returns current - * (always relative - without domain) - * - * @returns {string} The current base href - */ - self.baseHref = function() { - var href = baseElement.attr('href'); - return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : ''; - }; - - ////////////////////////////////////////////////////////////// - // Cookies API - ////////////////////////////////////////////////////////////// - var lastCookies = {}; - var lastCookieString = ''; - var cookiePath = self.baseHref(); - - function safeDecodeURIComponent(str) { - try { - return decodeURIComponent(str); - } catch (e) { - return str; - } - } - - /** - * @name $browser#cookies - * - * @param {string=} name Cookie name - * @param {string=} value Cookie value - * - * @description - * The cookies method provides a 'private' low level access to browser cookies. - * It is not meant to be used directly, use the $cookie service instead. - * - * The return values vary depending on the arguments that the method was called with as follows: - * - * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify - * it - * - cookies(name, value) -> set name to value, if value is undefined delete the cookie - * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that - * way) - * - * @returns {Object} Hash of all cookies (if called without any parameter) - */ - self.cookies = function(name, value) { - var cookieLength, cookieArray, cookie, i, index; - - if (name) { - if (value === undefined) { - rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath + - ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; - } else { - if (isString(value)) { - cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) + - ';path=' + cookiePath).length + 1; - - // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: - // - 300 cookies - // - 20 cookies per unique domain - // - 4096 bytes per cookie - if (cookieLength > 4096) { - $log.warn("Cookie '" + name + - "' possibly not set or overflowed because it was too large (" + - cookieLength + " > 4096 bytes)!"); - } - } - } - } else { - if (rawDocument.cookie !== lastCookieString) { - lastCookieString = rawDocument.cookie; - cookieArray = lastCookieString.split("; "); - lastCookies = {}; - - for (i = 0; i < cookieArray.length; i++) { - cookie = cookieArray[i]; - index = cookie.indexOf('='); - if (index > 0) { //ignore nameless cookies - name = safeDecodeURIComponent(cookie.substring(0, index)); - // the first value that is seen for a cookie is the most - // specific one. values for the same cookie name that - // follow are for less specific paths. - if (lastCookies[name] === undefined) { - lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1)); - } - } - } - } - return lastCookies; - } - }; - - - /** - * @name $browser#defer - * @param {function()} fn A function, who's execution should be deferred. - * @param {number=} [delay=0] of milliseconds to defer the function execution. - * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. - * - * @description - * Executes a fn asynchronously via `setTimeout(fn, delay)`. - * - * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using - * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed - * via `$browser.defer.flush()`. - * - */ - self.defer = function(fn, delay) { - var timeoutId; - outstandingRequestCount++; - timeoutId = setTimeout(function() { - delete pendingDeferIds[timeoutId]; - completeOutstandingRequest(fn); - }, delay || 0); - pendingDeferIds[timeoutId] = true; - return timeoutId; - }; - - - /** - * @name $browser#defer.cancel - * - * @description - * Cancels a deferred task identified with `deferId`. - * - * @param {*} deferId Token returned by the `$browser.defer` function. - * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully - * canceled. - */ - self.defer.cancel = function(deferId) { - if (pendingDeferIds[deferId]) { - delete pendingDeferIds[deferId]; - clearTimeout(deferId); - completeOutstandingRequest(noop); - return true; - } - return false; - }; - -} - -function $BrowserProvider() { - this.$get = ['$window', '$log', '$sniffer', '$document', - function($window, $log, $sniffer, $document) { - return new Browser($window, $document, $log, $sniffer); - }]; -} - -/** - * @ngdoc service - * @name $cacheFactory - * - * @description - * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to - * them. - * - * ```js - * - * var cache = $cacheFactory('cacheId'); - * expect($cacheFactory.get('cacheId')).toBe(cache); - * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); - * - * cache.put("key", "value"); - * cache.put("another key", "another value"); - * - * // We've specified no options on creation - * expect(cache.info()).toEqual({id: 'cacheId', size: 2}); - * - * ``` - * - * - * @param {string} cacheId Name or id of the newly created cache. - * @param {object=} options Options object that specifies the cache behavior. Properties: - * - * - `{number=}` `capacity` — turns the cache into LRU cache. - * - * @returns {object} Newly created cache object with the following set of methods: - * - * - `{object}` `info()` — Returns id, size, and options of cache. - * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns - * it. - * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. - * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. - * - `{void}` `removeAll()` — Removes all cached values. - * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. - * - * @example - - -
    - - - - -

    Cached Values

    -
    - - : - -
    - -

    Cache Info

    -
    - - : - -
    -
    -
    - - angular.module('cacheExampleApp', []). - controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) { - $scope.keys = []; - $scope.cache = $cacheFactory('cacheId'); - $scope.put = function(key, value) { - if ($scope.cache.get(key) === undefined) { - $scope.keys.push(key); - } - $scope.cache.put(key, value === undefined ? null : value); - }; - }]); - - - p { - margin: 10px 0 3px; - } - -
    - */ -function $CacheFactoryProvider() { - - this.$get = function() { - var caches = {}; - - function cacheFactory(cacheId, options) { - if (cacheId in caches) { - throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId); - } - - var size = 0, - stats = extend({}, options, {id: cacheId}), - data = {}, - capacity = (options && options.capacity) || Number.MAX_VALUE, - lruHash = {}, - freshEnd = null, - staleEnd = null; - - /** - * @ngdoc type - * @name $cacheFactory.Cache - * - * @description - * A cache object used to store and retrieve data, primarily used by - * {@link $http $http} and the {@link ng.directive:script script} directive to cache - * templates and other data. - * - * ```js - * angular.module('superCache') - * .factory('superCache', ['$cacheFactory', function($cacheFactory) { - * return $cacheFactory('super-cache'); - * }]); - * ``` - * - * Example test: - * - * ```js - * it('should behave like a cache', inject(function(superCache) { - * superCache.put('key', 'value'); - * superCache.put('another key', 'another value'); - * - * expect(superCache.info()).toEqual({ - * id: 'super-cache', - * size: 2 - * }); - * - * superCache.remove('another key'); - * expect(superCache.get('another key')).toBeUndefined(); - * - * superCache.removeAll(); - * expect(superCache.info()).toEqual({ - * id: 'super-cache', - * size: 0 - * }); - * })); - * ``` - */ - return caches[cacheId] = { - - /** - * @ngdoc method - * @name $cacheFactory.Cache#put - * @kind function - * - * @description - * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be - * retrieved later, and incrementing the size of the cache if the key was not already - * present in the cache. If behaving like an LRU cache, it will also remove stale - * entries from the set. - * - * It will not insert undefined values into the cache. - * - * @param {string} key the key under which the cached data is stored. - * @param {*} value the value to store alongside the key. If it is undefined, the key - * will not be stored. - * @returns {*} the value stored. - */ - put: function(key, value) { - if (capacity < Number.MAX_VALUE) { - var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); - - refresh(lruEntry); - } - - if (isUndefined(value)) return; - if (!(key in data)) size++; - data[key] = value; - - if (size > capacity) { - this.remove(staleEnd.key); - } - - return value; - }, - - /** - * @ngdoc method - * @name $cacheFactory.Cache#get - * @kind function - * - * @description - * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object. - * - * @param {string} key the key of the data to be retrieved - * @returns {*} the value stored. - */ - get: function(key) { - if (capacity < Number.MAX_VALUE) { - var lruEntry = lruHash[key]; - - if (!lruEntry) return; - - refresh(lruEntry); - } - - return data[key]; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#remove - * @kind function - * - * @description - * Removes an entry from the {@link $cacheFactory.Cache Cache} object. - * - * @param {string} key the key of the entry to be removed - */ - remove: function(key) { - if (capacity < Number.MAX_VALUE) { - var lruEntry = lruHash[key]; - - if (!lruEntry) return; - - if (lruEntry == freshEnd) freshEnd = lruEntry.p; - if (lruEntry == staleEnd) staleEnd = lruEntry.n; - link(lruEntry.n,lruEntry.p); - - delete lruHash[key]; - } - - delete data[key]; - size--; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#removeAll - * @kind function - * - * @description - * Clears the cache object of any entries. - */ - removeAll: function() { - data = {}; - size = 0; - lruHash = {}; - freshEnd = staleEnd = null; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#destroy - * @kind function - * - * @description - * Destroys the {@link $cacheFactory.Cache Cache} object entirely, - * removing it from the {@link $cacheFactory $cacheFactory} set. - */ - destroy: function() { - data = null; - stats = null; - lruHash = null; - delete caches[cacheId]; - }, - - - /** - * @ngdoc method - * @name $cacheFactory.Cache#info - * @kind function - * - * @description - * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}. - * - * @returns {object} an object with the following properties: - *
      - *
    • **id**: the id of the cache instance
    • - *
    • **size**: the number of entries kept in the cache instance
    • - *
    • **...**: any additional properties from the options object when creating the - * cache.
    • - *
    - */ - info: function() { - return extend({}, stats, {size: size}); - } - }; - - - /** - * makes the `entry` the freshEnd of the LRU linked list - */ - function refresh(entry) { - if (entry != freshEnd) { - if (!staleEnd) { - staleEnd = entry; - } else if (staleEnd == entry) { - staleEnd = entry.n; - } - - link(entry.n, entry.p); - link(entry, freshEnd); - freshEnd = entry; - freshEnd.n = null; - } - } - - - /** - * bidirectionally links two entries of the LRU linked list - */ - function link(nextEntry, prevEntry) { - if (nextEntry != prevEntry) { - if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify - if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify - } - } - } - - - /** - * @ngdoc method - * @name $cacheFactory#info - * - * @description - * Get information about all the caches that have been created - * - * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info` - */ - cacheFactory.info = function() { - var info = {}; - forEach(caches, function(cache, cacheId) { - info[cacheId] = cache.info(); - }); - return info; - }; - - - /** - * @ngdoc method - * @name $cacheFactory#get - * - * @description - * Get access to a cache object by the `cacheId` used when it was created. - * - * @param {string} cacheId Name or id of a cache to access. - * @returns {object} Cache object identified by the cacheId or undefined if no such cache. - */ - cacheFactory.get = function(cacheId) { - return caches[cacheId]; - }; - - - return cacheFactory; - }; -} - -/** - * @ngdoc service - * @name $templateCache - * - * @description - * The first time a template is used, it is loaded in the template cache for quick retrieval. You - * can load templates directly into the cache in a `script` tag, or by consuming the - * `$templateCache` service directly. - * - * Adding via the `script` tag: - * - * ```html - * - * ``` - * - * **Note:** the `script` tag containing the template does not need to be included in the `head` of - * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE, - * element with ng-app attribute), otherwise the template will be ignored. - * - * Adding via the $templateCache service: - * - * ```js - * var myApp = angular.module('myApp', []); - * myApp.run(function($templateCache) { - * $templateCache.put('templateId.html', 'This is the content of the template'); - * }); - * ``` - * - * To retrieve the template later, simply use it in your HTML: - * ```html - *
    - * ``` - * - * or get it via Javascript: - * ```js - * $templateCache.get('templateId.html') - * ``` - * - * See {@link ng.$cacheFactory $cacheFactory}. - * - */ -function $TemplateCacheProvider() { - this.$get = ['$cacheFactory', function($cacheFactory) { - return $cacheFactory('templates'); - }]; -} - -/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! - * - * DOM-related variables: - * - * - "node" - DOM Node - * - "element" - DOM Element or Node - * - "$node" or "$element" - jqLite-wrapped node or element - * - * - * Compiler related stuff: - * - * - "linkFn" - linking fn of a single directive - * - "nodeLinkFn" - function that aggregates all linking fns for a particular node - * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node - * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) - */ - - -/** - * @ngdoc service - * @name $compile - * @kind function - * - * @description - * Compiles an HTML string or DOM into a template and produces a template function, which - * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together. - * - * The compilation is a process of walking the DOM tree and matching DOM elements to - * {@link ng.$compileProvider#directive directives}. - * - *
    - * **Note:** This document is an in-depth reference of all directive options. - * For a gentle introduction to directives with examples of common use cases, - * see the {@link guide/directive directive guide}. - *
    - * - * ## Comprehensive Directive API - * - * There are many different options for a directive. - * - * The difference resides in the return value of the factory function. - * You can either return a "Directive Definition Object" (see below) that defines the directive properties, - * or just the `postLink` function (all other properties will have the default values). - * - *
    - * **Best Practice:** It's recommended to use the "directive definition object" form. - *
    - * - * Here's an example directive declared with a Directive Definition Object: - * - * ```js - * var myModule = angular.module(...); - * - * myModule.directive('directiveName', function factory(injectables) { - * var directiveDefinitionObject = { - * priority: 0, - * template: '
    ', // or // function(tElement, tAttrs) { ... }, - * // or - * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... }, - * transclude: false, - * restrict: 'A', - * templateNamespace: 'html', - * scope: false, - * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... }, - * controllerAs: 'stringAlias', - * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'], - * compile: function compile(tElement, tAttrs, transclude) { - * return { - * pre: function preLink(scope, iElement, iAttrs, controller) { ... }, - * post: function postLink(scope, iElement, iAttrs, controller) { ... } - * } - * // or - * // return function postLink( ... ) { ... } - * }, - * // or - * // link: { - * // pre: function preLink(scope, iElement, iAttrs, controller) { ... }, - * // post: function postLink(scope, iElement, iAttrs, controller) { ... } - * // } - * // or - * // link: function postLink( ... ) { ... } - * }; - * return directiveDefinitionObject; - * }); - * ``` - * - *
    - * **Note:** Any unspecified options will use the default value. You can see the default values below. - *
    - * - * Therefore the above can be simplified as: - * - * ```js - * var myModule = angular.module(...); - * - * myModule.directive('directiveName', function factory(injectables) { - * var directiveDefinitionObject = { - * link: function postLink(scope, iElement, iAttrs) { ... } - * }; - * return directiveDefinitionObject; - * // or - * // return function postLink(scope, iElement, iAttrs) { ... } - * }); - * ``` - * - * - * - * ### Directive Definition Object - * - * The directive definition object provides instructions to the {@link ng.$compile - * compiler}. The attributes are: - * - * #### `multiElement` - * When this property is set to true, the HTML compiler will collect DOM nodes between - * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them - * together as the directive elements. It is recommended that this feature be used on directives - * which are not strictly behavioural (such as {@link ngClick}), and which - * do not manipulate or replace child nodes (such as {@link ngInclude}). - * - * #### `priority` - * When there are multiple directives defined on a single DOM element, sometimes it - * is necessary to specify the order in which the directives are applied. The `priority` is used - * to sort the directives before their `compile` functions get called. Priority is defined as a - * number. Directives with greater numerical `priority` are compiled first. Pre-link functions - * are also run in priority order, but post-link functions are run in reverse order. The order - * of directives with the same priority is undefined. The default priority is `0`. - * - * #### `terminal` - * If set to true then the current `priority` will be the last set of directives - * which will execute (any directives at the current priority will still execute - * as the order of execution on same `priority` is undefined). Note that expressions - * and other directives used in the directive's template will also be excluded from execution. - * - * #### `scope` - * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the - * same element request a new scope, only one new scope is created. The new scope rule does not - * apply for the root of the template since the root of the template always gets a new scope. - * - * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from - * normal scope in that it does not prototypically inherit from the parent scope. This is useful - * when creating reusable components, which should not accidentally read or modify data in the - * parent scope. - * - * The 'isolate' scope takes an object hash which defines a set of local scope properties - * derived from the parent scope. These local properties are useful for aliasing values for - * templates. Locals definition is a hash of local scope property to its source: - * - * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is - * always a string since DOM attributes are strings. If no `attr` name is specified then the - * attribute name is assumed to be the same as the local name. - * Given `` and widget definition - * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect - * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the - * `localName` property on the widget scope. The `name` is read from the parent scope (not - * component scope). - * - * * `=` or `=attr` - set up bi-directional binding between a local scope property and the - * parent scope property of name defined via the value of the `attr` attribute. If no `attr` - * name is specified then the attribute name is assumed to be the same as the local name. - * Given `` and widget definition of - * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the - * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected - * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent - * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You - * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If - * you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use - * `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional). - * - * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. - * If no `attr` name is specified then the attribute name is assumed to be the same as the - * local name. Given `` and widget definition of - * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to - * a function wrapper for the `count = count + value` expression. Often it's desirable to - * pass data from the isolated scope via an expression to the parent scope, this can be - * done by passing a map of local variable names and values into the expression wrapper fn. - * For example, if the expression is `increment(amount)` then we can specify the amount value - * by calling the `localFn` as `localFn({amount: 22})`. - * - * - * #### `bindToController` - * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will - * allow a component to have its properties bound to the controller, rather than to scope. When the controller - * is instantiated, the initial values of the isolate scope bindings are already available. - * - * #### `controller` - * Controller constructor function. The controller is instantiated before the - * pre-linking phase and it is shared with other directives (see - * `require` attribute). This allows the directives to communicate with each other and augment - * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals: - * - * * `$scope` - Current scope associated with the element - * * `$element` - Current element - * * `$attrs` - Current attributes object for the element - * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope: - * `function([scope], cloneLinkingFn, futureParentElement)`. - * * `scope`: optional argument to override the scope. - * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content. - * * `futureParentElement`: - * * defines the parent to which the `cloneLinkingFn` will add the cloned elements. - * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`. - * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements) - * and when the `cloneLinkinFn` is passed, - * as those elements need to created and cloned in a special way when they are defined outside their - * usual containers (e.g. like ``). - * * See also the `directive.templateNamespace` property. - * - * - * #### `require` - * Require another directive and inject its controller as the fourth argument to the linking function. The - * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the - * injected argument will be an array in corresponding order. If no such directive can be - * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with: - * - * * (no prefix) - Locate the required controller on the current element. Throw an error if not found. - * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found. - * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found. - * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found. - * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass - * `null` to the `link` fn if not found. - * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass - * `null` to the `link` fn if not found. - * - * - * #### `controllerAs` - * Controller alias at the directive scope. An alias for the controller so it - * can be referenced at the directive template. The directive needs to define a scope for this - * configuration to be used. Useful in the case when directive is used as component. - * - * - * #### `restrict` - * String of subset of `EACM` which restricts the directive to a specific directive - * declaration style. If omitted, the defaults (elements and attributes) are used. - * - * * `E` - Element name (default): `` - * * `A` - Attribute (default): `
    ` - * * `C` - Class: `
    ` - * * `M` - Comment: `` - * - * - * #### `templateNamespace` - * String representing the document type used by the markup in the template. - * AngularJS needs this information as those elements need to be created and cloned - * in a special way when they are defined outside their usual containers like `` and ``. - * - * * `html` - All root nodes in the template are HTML. Root nodes may also be - * top-level elements such as `` or ``. - * * `svg` - The root nodes in the template are SVG elements (excluding ``). - * * `math` - The root nodes in the template are MathML elements (excluding ``). - * - * If no `templateNamespace` is specified, then the namespace is considered to be `html`. - * - * #### `template` - * HTML markup that may: - * * Replace the contents of the directive's element (default). - * * Replace the directive's element itself (if `replace` is true - DEPRECATED). - * * Wrap the contents of the directive's element (if `transclude` is true). - * - * Value may be: - * - * * A string. For example `
    {{delete_str}}
    `. - * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile` - * function api below) and returns a string value. - * - * - * #### `templateUrl` - * This is similar to `template` but the template is loaded from the specified URL, asynchronously. - * - * Because template loading is asynchronous the compiler will suspend compilation of directives on that element - * for later when the template has been resolved. In the meantime it will continue to compile and link - * sibling and parent elements as though this element had not contained any directives. - * - * The compiler does not suspend the entire compilation to wait for templates to be loaded because this - * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the - * case when only one deeply nested directive has `templateUrl`. - * - * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache} - * - * You can specify `templateUrl` as a string representing the URL or as a function which takes two - * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns - * a string value representing the url. In either case, the template URL is passed through {@link - * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}. - * - * - * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0) - * specify what the template should replace. Defaults to `false`. - * - * * `true` - the template will replace the directive's element. - * * `false` - the template will replace the contents of the directive's element. - * - * The replacement process migrates all of the attributes / classes from the old element to the new - * one. See the {@link guide/directive#template-expanding-directive - * Directives Guide} for an example. - * - * There are very few scenarios where element replacement is required for the application function, - * the main one being reusable custom components that are used within SVG contexts - * (because SVG doesn't work with custom elements in the DOM tree). - * - * #### `transclude` - * Extract the contents of the element where the directive appears and make it available to the directive. - * The contents are compiled and provided to the directive as a **transclusion function**. See the - * {@link $compile#transclusion Transclusion} section below. - * - * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the - * directive's element or the entire element: - * - * * `true` - transclude the content (i.e. the child nodes) of the directive's element. - * * `'element'` - transclude the whole of the directive's element including any directives on this - * element that defined at a lower priority than this directive. When used, the `template` - * property is ignored. - * - * - * #### `compile` - * - * ```js - * function compile(tElement, tAttrs, transclude) { ... } - * ``` - * - * The compile function deals with transforming the template DOM. Since most directives do not do - * template transformation, it is not used often. The compile function takes the following arguments: - * - * * `tElement` - template element - The element where the directive has been declared. It is - * safe to do template transformation on the element and child elements only. - * - * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared - * between all directive compile functions. - * - * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)` - * - *
    - * **Note:** The template instance and the link instance may be different objects if the template has - * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that - * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration - * should be done in a linking function rather than in a compile function. - *
    - - *
    - * **Note:** The compile function cannot handle directives that recursively use themselves in their - * own templates or compile functions. Compiling these directives results in an infinite loop and a - * stack overflow errors. - * - * This can be avoided by manually using $compile in the postLink function to imperatively compile - * a directive's template instead of relying on automatic template compilation via `template` or - * `templateUrl` declaration or manual compilation inside the compile function. - *
    - * - *
    - * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it - * e.g. does not know about the right outer scope. Please use the transclude function that is passed - * to the link function instead. - *
    - - * A compile function can have a return value which can be either a function or an object. - * - * * returning a (post-link) function - is equivalent to registering the linking function via the - * `link` property of the config object when the compile function is empty. - * - * * returning an object with function(s) registered via `pre` and `post` properties - allows you to - * control when a linking function should be called during the linking phase. See info about - * pre-linking and post-linking functions below. - * - * - * #### `link` - * This property is used only if the `compile` property is not defined. - * - * ```js - * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... } - * ``` - * - * The link function is responsible for registering DOM listeners as well as updating the DOM. It is - * executed after the template has been cloned. This is where most of the directive logic will be - * put. - * - * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the - * directive for registering {@link ng.$rootScope.Scope#$watch watches}. - * - * * `iElement` - instance element - The element where the directive is to be used. It is safe to - * manipulate the children of the element only in `postLink` function since the children have - * already been linked. - * - * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared - * between all directive linking functions. - * - * * `controller` - a controller instance - A controller instance if at least one directive on the - * element defines a controller. The controller is shared among all the directives, which allows - * the directives to use the controllers as a communication channel. - * - * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope. - * This is the same as the `$transclude` - * parameter of directive controllers, see there for details. - * `function([scope], cloneLinkingFn, futureParentElement)`. - * - * #### Pre-linking function - * - * Executed before the child elements are linked. Not safe to do DOM transformation since the - * compiler linking function will fail to locate the correct elements for linking. - * - * #### Post-linking function - * - * Executed after the child elements are linked. - * - * Note that child elements that contain `templateUrl` directives will not have been compiled - * and linked since they are waiting for their template to load asynchronously and their own - * compilation and linking has been suspended until that occurs. - * - * It is safe to do DOM transformation in the post-linking function on elements that are not waiting - * for their async templates to be resolved. - * - * - * ### Transclusion - * - * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and - * copying them to another part of the DOM, while maintaining their connection to the original AngularJS - * scope from where they were taken. - * - * Transclusion is used (often with {@link ngTransclude}) to insert the - * original contents of a directive's element into a specified place in the template of the directive. - * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded - * content has access to the properties on the scope from which it was taken, even if the directive - * has isolated scope. - * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}. - * - * This makes it possible for the widget to have private state for its template, while the transcluded - * content has access to its originating scope. - * - *
    - * **Note:** When testing an element transclude directive you must not place the directive at the root of the - * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives - * Testing Transclusion Directives}. - *
    - * - * #### Transclusion Functions - * - * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion - * function** to the directive's `link` function and `controller`. This transclusion function is a special - * **linking function** that will return the compiled contents linked to a new transclusion scope. - * - *
    - * If you are just using {@link ngTransclude} then you don't need to worry about this function, since - * ngTransclude will deal with it for us. - *
    - * - * If you want to manually control the insertion and removal of the transcluded content in your directive - * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery - * object that contains the compiled DOM, which is linked to the correct transclusion scope. - * - * When you call a transclusion function you can pass in a **clone attach function**. This function accepts - * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded - * content and the `scope` is the newly created transclusion scope, to which the clone is bound. - * - *
    - * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function - * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope. - *
    - * - * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone - * attach function**: - * - * ```js - * var transcludedContent, transclusionScope; - * - * $transclude(function(clone, scope) { - * element.append(clone); - * transcludedContent = clone; - * transclusionScope = scope; - * }); - * ``` - * - * Later, if you want to remove the transcluded content from your DOM then you should also destroy the - * associated transclusion scope: - * - * ```js - * transcludedContent.remove(); - * transclusionScope.$destroy(); - * ``` - * - *
    - * **Best Practice**: if you intend to add and remove transcluded content manually in your directive - * (by calling the transclude function to get the DOM and and calling `element.remove()` to remove it), - * then you are also responsible for calling `$destroy` on the transclusion scope. - *
    - * - * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat} - * automatically destroy their transluded clones as necessary so you do not need to worry about this if - * you are simply using {@link ngTransclude} to inject the transclusion into your directive. - * - * - * #### Transclusion Scopes - * - * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion - * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed - * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it - * was taken. - * - * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look - * like this: - * - * ```html - *
    - *
    - *
    - *
    - *
    - *
    - * ``` - * - * The `$parent` scope hierarchy will look like this: - * - * ``` - * - $rootScope - * - isolate - * - transclusion - * ``` - * - * but the scopes will inherit prototypically from different scopes to their `$parent`. - * - * ``` - * - $rootScope - * - transclusion - * - isolate - * ``` - * - * - * ### Attributes - * - * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the - * `link()` or `compile()` functions. It has a variety of uses. - * - * accessing *Normalized attribute names:* - * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'. - * the attributes object allows for normalized access to - * the attributes. - * - * * *Directive inter-communication:* All directives share the same instance of the attributes - * object which allows the directives to use the attributes object as inter directive - * communication. - * - * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object - * allowing other directives to read the interpolated value. - * - * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes - * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also - * the only way to easily get the actual value because during the linking phase the interpolation - * hasn't been evaluated yet and so the value is at this time set to `undefined`. - * - * ```js - * function linkingFn(scope, elm, attrs, ctrl) { - * // get the attribute value - * console.log(attrs.ngModel); - * - * // change the attribute - * attrs.$set('ngModel', 'new value'); - * - * // observe changes to interpolated attribute - * attrs.$observe('ngModel', function(value) { - * console.log('ngModel has changed value to ' + value); - * }); - * } - * ``` - * - * ## Example - * - *
    - * **Note**: Typically directives are registered with `module.directive`. The example below is - * to illustrate how `$compile` works. - *
    - * - - - -
    -
    -
    -
    -
    -
    - - it('should auto compile', function() { - var textarea = $('textarea'); - var output = $('div[compile]'); - // The initial state reads 'Hello Angular'. - expect(output.getText()).toBe('Hello Angular'); - textarea.clear(); - textarea.sendKeys('{{name}}!'); - expect(output.getText()).toBe('Angular!'); - }); - -
    - - * - * - * @param {string|DOMElement} element Element or HTML string to compile into a template function. - * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED. - * - *
    - * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it - * e.g. will not use the right outer scope. Please pass the transclude function as a - * `parentBoundTranscludeFn` to the link function instead. - *
    - * - * @param {number} maxPriority only apply directives lower than given priority (Only effects the - * root element(s), not their children) - * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template - * (a DOM element/tree) to a scope. Where: - * - * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. - * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the - * `template` and call the `cloneAttachFn` function allowing the caller to attach the - * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is - * called as:
    `cloneAttachFn(clonedElement, scope)` where: - * - * * `clonedElement` - is a clone of the original `element` passed into the compiler. - * * `scope` - is the current scope with which the linking function is working with. - * - * * `options` - An optional object hash with linking options. If `options` is provided, then the following - * keys may be used to control linking behavior: - * - * * `parentBoundTranscludeFn` - the transclude function made available to - * directives; if given, it will be passed through to the link functions of - * directives found in `element` during compilation. - * * `transcludeControllers` - an object hash with keys that map controller names - * to controller instances; if given, it will make the controllers - * available to directives. - * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add - * the cloned elements; only needed for transcludes that are allowed to contain non html - * elements (e.g. SVG elements). See also the directive.controller property. - * - * Calling the linking function returns the element of the template. It is either the original - * element passed in, or the clone of the element if the `cloneAttachFn` is provided. - * - * After linking the view is not updated until after a call to $digest which typically is done by - * Angular automatically. - * - * If you need access to the bound view, there are two ways to do it: - * - * - If you are not asking the linking function to clone the template, create the DOM element(s) - * before you send them to the compiler and keep this reference around. - * ```js - * var element = $compile('

    {{total}}

    ')(scope); - * ``` - * - * - if on the other hand, you need the element to be cloned, the view reference from the original - * example would not point to the clone, but rather to the original template that was cloned. In - * this case, you can access the clone via the cloneAttachFn: - * ```js - * var templateElement = angular.element('

    {{total}}

    '), - * scope = ....; - * - * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) { - * //attach the clone to DOM document at the right place - * }); - * - * //now we have reference to the cloned DOM via `clonedElement` - * ``` - * - * - * For information on how the compiler works, see the - * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. - */ - -var $compileMinErr = minErr('$compile'); - -/** - * @ngdoc provider - * @name $compileProvider - * - * @description - */ -$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider']; -function $CompileProvider($provide, $$sanitizeUriProvider) { - var hasDirectives = {}, - Suffix = 'Directive', - COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/, - CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/, - ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'), - REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/; - - // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes - // The assumption is that future DOM event attribute names will begin with - // 'on' and be composed of only English letters. - var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/; - - function parseIsolateBindings(scope, directiveName) { - var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/; - - var bindings = {}; - - forEach(scope, function(definition, scopeName) { - var match = definition.match(LOCAL_REGEXP); - - if (!match) { - throw $compileMinErr('iscp', - "Invalid isolate scope definition for directive '{0}'." + - " Definition: {... {1}: '{2}' ...}", - directiveName, scopeName, definition); - } - - bindings[scopeName] = { - mode: match[1][0], - collection: match[2] === '*', - optional: match[3] === '?', - attrName: match[4] || scopeName - }; - }); - - return bindings; - } - - /** - * @ngdoc method - * @name $compileProvider#directive - * @kind function - * - * @description - * Register a new directive with the compiler. - * - * @param {string|Object} name Name of the directive in camel-case (i.e. ngBind which - * will match as ng-bind), or an object map of directives where the keys are the - * names and the values are the factories. - * @param {Function|Array} directiveFactory An injectable directive factory function. See - * {@link guide/directive} for more info. - * @returns {ng.$compileProvider} Self for chaining. - */ - this.directive = function registerDirective(name, directiveFactory) { - assertNotHasOwnProperty(name, 'directive'); - if (isString(name)) { - assertArg(directiveFactory, 'directiveFactory'); - if (!hasDirectives.hasOwnProperty(name)) { - hasDirectives[name] = []; - $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', - function($injector, $exceptionHandler) { - var directives = []; - forEach(hasDirectives[name], function(directiveFactory, index) { - try { - var directive = $injector.invoke(directiveFactory); - if (isFunction(directive)) { - directive = { compile: valueFn(directive) }; - } else if (!directive.compile && directive.link) { - directive.compile = valueFn(directive.link); - } - directive.priority = directive.priority || 0; - directive.index = index; - directive.name = directive.name || name; - directive.require = directive.require || (directive.controller && directive.name); - directive.restrict = directive.restrict || 'EA'; - if (isObject(directive.scope)) { - directive.$$isolateBindings = parseIsolateBindings(directive.scope, directive.name); - } - directives.push(directive); - } catch (e) { - $exceptionHandler(e); - } - }); - return directives; - }]); - } - hasDirectives[name].push(directiveFactory); - } else { - forEach(name, reverseParams(registerDirective)); - } - return this; - }; - - - /** - * @ngdoc method - * @name $compileProvider#aHrefSanitizationWhitelist - * @kind function - * - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during a[href] sanitization. - * - * The sanitization is a security measure aimed at preventing XSS attacks via html links. - * - * Any url about to be assigned to a[href] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.aHrefSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp); - return this; - } else { - return $$sanitizeUriProvider.aHrefSanitizationWhitelist(); - } - }; - - - /** - * @ngdoc method - * @name $compileProvider#imgSrcSanitizationWhitelist - * @kind function - * - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during img[src] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to img[src] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.imgSrcSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp); - return this; - } else { - return $$sanitizeUriProvider.imgSrcSanitizationWhitelist(); - } - }; - - /** - * @ngdoc method - * @name $compileProvider#debugInfoEnabled - * - * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the - * current debugInfoEnabled state - * @returns {*} current value if used as getter or itself (chaining) if used as setter - * - * @kind function - * - * @description - * Call this method to enable/disable various debug runtime information in the compiler such as adding - * binding information and a reference to the current scope on to DOM elements. - * If enabled, the compiler will add the following to DOM elements that have been bound to the scope - * * `ng-binding` CSS class - * * `$binding` data property containing an array of the binding expressions - * - * You may want to disable this in production for a significant performance boost. See - * {@link guide/production#disabling-debug-data Disabling Debug Data} for more. - * - * The default value is true. - */ - var debugInfoEnabled = true; - this.debugInfoEnabled = function(enabled) { - if (isDefined(enabled)) { - debugInfoEnabled = enabled; - return this; - } - return debugInfoEnabled; - }; - - this.$get = [ - '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse', - '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri', - function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse, - $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) { - - var Attributes = function(element, attributesToCopy) { - if (attributesToCopy) { - var keys = Object.keys(attributesToCopy); - var i, l, key; - - for (i = 0, l = keys.length; i < l; i++) { - key = keys[i]; - this[key] = attributesToCopy[key]; - } - } else { - this.$attr = {}; - } - - this.$$element = element; - }; - - Attributes.prototype = { - /** - * @ngdoc method - * @name $compile.directive.Attributes#$normalize - * @kind function - * - * @description - * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or - * `data-`) to its normalized, camelCase form. - * - * Also there is special case for Moz prefix starting with upper case letter. - * - * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives} - * - * @param {string} name Name to normalize - */ - $normalize: directiveNormalize, - - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$addClass - * @kind function - * - * @description - * Adds the CSS class value specified by the classVal parameter to the element. If animations - * are enabled then an animation will be triggered for the class addition. - * - * @param {string} classVal The className value that will be added to the element - */ - $addClass: function(classVal) { - if (classVal && classVal.length > 0) { - $animate.addClass(this.$$element, classVal); - } - }, - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$removeClass - * @kind function - * - * @description - * Removes the CSS class value specified by the classVal parameter from the element. If - * animations are enabled then an animation will be triggered for the class removal. - * - * @param {string} classVal The className value that will be removed from the element - */ - $removeClass: function(classVal) { - if (classVal && classVal.length > 0) { - $animate.removeClass(this.$$element, classVal); - } - }, - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$updateClass - * @kind function - * - * @description - * Adds and removes the appropriate CSS class values to the element based on the difference - * between the new and old CSS class values (specified as newClasses and oldClasses). - * - * @param {string} newClasses The current CSS className value - * @param {string} oldClasses The former CSS className value - */ - $updateClass: function(newClasses, oldClasses) { - var toAdd = tokenDifference(newClasses, oldClasses); - if (toAdd && toAdd.length) { - $animate.addClass(this.$$element, toAdd); - } - - var toRemove = tokenDifference(oldClasses, newClasses); - if (toRemove && toRemove.length) { - $animate.removeClass(this.$$element, toRemove); - } - }, - - /** - * Set a normalized attribute on the element in a way such that all directives - * can share the attribute. This function properly handles boolean attributes. - * @param {string} key Normalized key. (ie ngAttribute) - * @param {string|boolean} value The value to set. If `null` attribute will be deleted. - * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. - * Defaults to true. - * @param {string=} attrName Optional none normalized name. Defaults to key. - */ - $set: function(key, value, writeAttr, attrName) { - // TODO: decide whether or not to throw an error if "class" - //is set through this function since it may cause $updateClass to - //become unstable. - - var node = this.$$element[0], - booleanKey = getBooleanAttrName(node, key), - aliasedKey = getAliasedAttrName(node, key), - observer = key, - nodeName; - - if (booleanKey) { - this.$$element.prop(key, value); - attrName = booleanKey; - } else if (aliasedKey) { - this[aliasedKey] = value; - observer = aliasedKey; - } - - this[key] = value; - - // translate normalized key to actual key - if (attrName) { - this.$attr[key] = attrName; - } else { - attrName = this.$attr[key]; - if (!attrName) { - this.$attr[key] = attrName = snake_case(key, '-'); - } - } - - nodeName = nodeName_(this.$$element); - - if ((nodeName === 'a' && key === 'href') || - (nodeName === 'img' && key === 'src')) { - // sanitize a[href] and img[src] values - this[key] = value = $$sanitizeUri(value, key === 'src'); - } else if (nodeName === 'img' && key === 'srcset') { - // sanitize img[srcset] values - var result = ""; - - // first check if there are spaces because it's not the same pattern - var trimmedSrcset = trim(value); - // ( 999x ,| 999w ,| ,|, ) - var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/; - var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/; - - // split srcset into tuple of uri and descriptor except for the last item - var rawUris = trimmedSrcset.split(pattern); - - // for each tuples - var nbrUrisWith2parts = Math.floor(rawUris.length / 2); - for (var i = 0; i < nbrUrisWith2parts; i++) { - var innerIdx = i * 2; - // sanitize the uri - result += $$sanitizeUri(trim(rawUris[innerIdx]), true); - // add the descriptor - result += (" " + trim(rawUris[innerIdx + 1])); - } - - // split the last item into uri and descriptor - var lastTuple = trim(rawUris[i * 2]).split(/\s/); - - // sanitize the last uri - result += $$sanitizeUri(trim(lastTuple[0]), true); - - // and add the last descriptor if any - if (lastTuple.length === 2) { - result += (" " + trim(lastTuple[1])); - } - this[key] = value = result; - } - - if (writeAttr !== false) { - if (value === null || value === undefined) { - this.$$element.removeAttr(attrName); - } else { - this.$$element.attr(attrName, value); - } - } - - // fire observers - var $$observers = this.$$observers; - $$observers && forEach($$observers[observer], function(fn) { - try { - fn(value); - } catch (e) { - $exceptionHandler(e); - } - }); - }, - - - /** - * @ngdoc method - * @name $compile.directive.Attributes#$observe - * @kind function - * - * @description - * Observes an interpolated attribute. - * - * The observer function will be invoked once during the next `$digest` following - * compilation. The observer is then invoked whenever the interpolated value - * changes. - * - * @param {string} key Normalized key. (ie ngAttribute) . - * @param {function(interpolatedValue)} fn Function that will be called whenever - the interpolated value of the attribute changes. - * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info. - * @returns {function()} Returns a deregistration function for this observer. - */ - $observe: function(key, fn) { - var attrs = this, - $$observers = (attrs.$$observers || (attrs.$$observers = createMap())), - listeners = ($$observers[key] || ($$observers[key] = [])); - - listeners.push(fn); - $rootScope.$evalAsync(function() { - if (!listeners.$$inter && attrs.hasOwnProperty(key)) { - // no one registered attribute interpolation function, so lets call it manually - fn(attrs[key]); - } - }); - - return function() { - arrayRemove(listeners, fn); - }; - } - }; - - - function safeAddClass($element, className) { - try { - $element.addClass(className); - } catch (e) { - // ignore, since it means that we are trying to set class on - // SVG element, where class name is read-only. - } - } - - - var startSymbol = $interpolate.startSymbol(), - endSymbol = $interpolate.endSymbol(), - denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') - ? identity - : function denormalizeTemplate(template) { - return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); - }, - NG_ATTR_BINDING = /^ngAttr[A-Z]/; - - compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) { - var bindings = $element.data('$binding') || []; - - if (isArray(binding)) { - bindings = bindings.concat(binding); - } else { - bindings.push(binding); - } - - $element.data('$binding', bindings); - } : noop; - - compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) { - safeAddClass($element, 'ng-binding'); - } : noop; - - compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) { - var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope'; - $element.data(dataName, scope); - } : noop; - - compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) { - safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope'); - } : noop; - - return compile; - - //================================ - - function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, - previousCompileContext) { - if (!($compileNodes instanceof jqLite)) { - // jquery always rewraps, whereas we need to preserve the original selector so that we can - // modify it. - $compileNodes = jqLite($compileNodes); - } - // We can not compile top level text elements since text nodes can be merged and we will - // not be able to attach scope data to them, so we will wrap them in - forEach($compileNodes, function(node, index) { - if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) { - $compileNodes[index] = jqLite(node).wrap('').parent()[0]; - } - }); - var compositeLinkFn = - compileNodes($compileNodes, transcludeFn, $compileNodes, - maxPriority, ignoreDirective, previousCompileContext); - compile.$$addScopeClass($compileNodes); - var namespace = null; - return function publicLinkFn(scope, cloneConnectFn, options) { - assertArg(scope, 'scope'); - - options = options || {}; - var parentBoundTranscludeFn = options.parentBoundTranscludeFn, - transcludeControllers = options.transcludeControllers, - futureParentElement = options.futureParentElement; - - // When `parentBoundTranscludeFn` is passed, it is a - // `controllersBoundTransclude` function (it was previously passed - // as `transclude` to directive.link) so we must unwrap it to get - // its `boundTranscludeFn` - if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) { - parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude; - } - - if (!namespace) { - namespace = detectNamespaceForChildElements(futureParentElement); - } - var $linkNode; - if (namespace !== 'html') { - // When using a directive with replace:true and templateUrl the $compileNodes - // (or a child element inside of them) - // might change, so we need to recreate the namespace adapted compileNodes - // for call to the link function. - // Note: This will already clone the nodes... - $linkNode = jqLite( - wrapTemplate(namespace, jqLite('
    ').append($compileNodes).html()) - ); - } else if (cloneConnectFn) { - // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart - // and sometimes changes the structure of the DOM. - $linkNode = JQLitePrototype.clone.call($compileNodes); - } else { - $linkNode = $compileNodes; - } - - if (transcludeControllers) { - for (var controllerName in transcludeControllers) { - $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance); - } - } - - compile.$$addScopeInfo($linkNode, scope); - - if (cloneConnectFn) cloneConnectFn($linkNode, scope); - if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn); - return $linkNode; - }; - } - - function detectNamespaceForChildElements(parentElement) { - // TODO: Make this detect MathML as well... - var node = parentElement && parentElement[0]; - if (!node) { - return 'html'; - } else { - return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html'; - } - } - - /** - * Compile function matches each node in nodeList against the directives. Once all directives - * for a particular node are collected their compile functions are executed. The compile - * functions return values - the linking functions - are combined into a composite linking - * function, which is the a linking function for the node. - * - * @param {NodeList} nodeList an array of nodes or NodeList to compile - * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the - * scope argument is auto-generated to the new child of the transcluded parent scope. - * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then - * the rootElement must be set the jqLite collection of the compile root. This is - * needed so that the jqLite collection items can be replaced with widgets. - * @param {number=} maxPriority Max directive priority. - * @returns {Function} A composite linking function of all of the matched directives or null. - */ - function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective, - previousCompileContext) { - var linkFns = [], - attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound; - - for (var i = 0; i < nodeList.length; i++) { - attrs = new Attributes(); - - // we must always refer to nodeList[i] since the nodes can be replaced underneath us. - directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined, - ignoreDirective); - - nodeLinkFn = (directives.length) - ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement, - null, [], [], previousCompileContext) - : null; - - if (nodeLinkFn && nodeLinkFn.scope) { - compile.$$addScopeClass(attrs.$$element); - } - - childLinkFn = (nodeLinkFn && nodeLinkFn.terminal || - !(childNodes = nodeList[i].childNodes) || - !childNodes.length) - ? null - : compileNodes(childNodes, - nodeLinkFn ? ( - (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement) - && nodeLinkFn.transclude) : transcludeFn); - - if (nodeLinkFn || childLinkFn) { - linkFns.push(i, nodeLinkFn, childLinkFn); - linkFnFound = true; - nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn; - } - - //use the previous context only for the first element in the virtual group - previousCompileContext = null; - } - - // return a linking function if we have found anything, null otherwise - return linkFnFound ? compositeLinkFn : null; - - function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) { - var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn; - var stableNodeList; - - - if (nodeLinkFnFound) { - // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our - // offsets don't get screwed up - var nodeListLength = nodeList.length; - stableNodeList = new Array(nodeListLength); - - // create a sparse array by only copying the elements which have a linkFn - for (i = 0; i < linkFns.length; i+=3) { - idx = linkFns[i]; - stableNodeList[idx] = nodeList[idx]; - } - } else { - stableNodeList = nodeList; - } - - for (i = 0, ii = linkFns.length; i < ii;) { - node = stableNodeList[linkFns[i++]]; - nodeLinkFn = linkFns[i++]; - childLinkFn = linkFns[i++]; - - if (nodeLinkFn) { - if (nodeLinkFn.scope) { - childScope = scope.$new(); - compile.$$addScopeInfo(jqLite(node), childScope); - } else { - childScope = scope; - } - - if (nodeLinkFn.transcludeOnThisElement) { - childBoundTranscludeFn = createBoundTranscludeFn( - scope, nodeLinkFn.transclude, parentBoundTranscludeFn, - nodeLinkFn.elementTranscludeOnThisElement); - - } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) { - childBoundTranscludeFn = parentBoundTranscludeFn; - - } else if (!parentBoundTranscludeFn && transcludeFn) { - childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn); - - } else { - childBoundTranscludeFn = null; - } - - nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn); - - } else if (childLinkFn) { - childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn); - } - } - } - } - - function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn, elementTransclusion) { - - var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) { - - if (!transcludedScope) { - transcludedScope = scope.$new(false, containingScope); - transcludedScope.$$transcluded = true; - } - - return transcludeFn(transcludedScope, cloneFn, { - parentBoundTranscludeFn: previousBoundTranscludeFn, - transcludeControllers: controllers, - futureParentElement: futureParentElement - }); - }; - - return boundTranscludeFn; - } - - /** - * Looks for directives on the given node and adds them to the directive collection which is - * sorted. - * - * @param node Node to search. - * @param directives An array to which the directives are added to. This array is sorted before - * the function returns. - * @param attrs The shared attrs object which is used to populate the normalized attributes. - * @param {number=} maxPriority Max directive priority. - */ - function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) { - var nodeType = node.nodeType, - attrsMap = attrs.$attr, - match, - className; - - switch (nodeType) { - case NODE_TYPE_ELEMENT: /* Element */ - // use the node name: - addDirective(directives, - directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); - - // iterate over the attributes - for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes, - j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { - var attrStartName = false; - var attrEndName = false; - - attr = nAttrs[j]; - name = attr.name; - value = trim(attr.value); - - // support ngAttr attribute binding - ngAttrName = directiveNormalize(name); - if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) { - name = name.replace(PREFIX_REGEXP, '') - .substr(8).replace(/_(.)/g, function(match, letter) { - return letter.toUpperCase(); - }); - } - - var directiveNName = ngAttrName.replace(/(Start|End)$/, ''); - if (directiveIsMultiElement(directiveNName)) { - if (ngAttrName === directiveNName + 'Start') { - attrStartName = name; - attrEndName = name.substr(0, name.length - 5) + 'end'; - name = name.substr(0, name.length - 6); - } - } - - nName = directiveNormalize(name.toLowerCase()); - attrsMap[nName] = name; - if (isNgAttr || !attrs.hasOwnProperty(nName)) { - attrs[nName] = value; - if (getBooleanAttrName(node, nName)) { - attrs[nName] = true; // presence means true - } - } - addAttrInterpolateDirective(node, directives, value, nName, isNgAttr); - addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName, - attrEndName); - } - - // use class as directive - className = node.className; - if (isObject(className)) { - // Maybe SVGAnimatedString - className = className.animVal; - } - if (isString(className) && className !== '') { - while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { - nName = directiveNormalize(match[2]); - if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) { - attrs[nName] = trim(match[3]); - } - className = className.substr(match.index + match[0].length); - } - } - break; - case NODE_TYPE_TEXT: /* Text Node */ - addTextInterpolateDirective(directives, node.nodeValue); - break; - case NODE_TYPE_COMMENT: /* Comment */ - try { - match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); - if (match) { - nName = directiveNormalize(match[1]); - if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) { - attrs[nName] = trim(match[2]); - } - } - } catch (e) { - // turns out that under some circumstances IE9 throws errors when one attempts to read - // comment's node value. - // Just ignore it and continue. (Can't seem to reproduce in test case.) - } - break; - } - - directives.sort(byPriority); - return directives; - } - - /** - * Given a node with an directive-start it collects all of the siblings until it finds - * directive-end. - * @param node - * @param attrStart - * @param attrEnd - * @returns {*} - */ - function groupScan(node, attrStart, attrEnd) { - var nodes = []; - var depth = 0; - if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) { - do { - if (!node) { - throw $compileMinErr('uterdir', - "Unterminated attribute, found '{0}' but no matching '{1}' found.", - attrStart, attrEnd); - } - if (node.nodeType == NODE_TYPE_ELEMENT) { - if (node.hasAttribute(attrStart)) depth++; - if (node.hasAttribute(attrEnd)) depth--; - } - nodes.push(node); - node = node.nextSibling; - } while (depth > 0); - } else { - nodes.push(node); - } - - return jqLite(nodes); - } - - /** - * Wrapper for linking function which converts normal linking function into a grouped - * linking function. - * @param linkFn - * @param attrStart - * @param attrEnd - * @returns {Function} - */ - function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) { - return function(scope, element, attrs, controllers, transcludeFn) { - element = groupScan(element[0], attrStart, attrEnd); - return linkFn(scope, element, attrs, controllers, transcludeFn); - }; - } - - /** - * Once the directives have been collected, their compile functions are executed. This method - * is responsible for inlining directive templates as well as terminating the application - * of the directives if the terminal directive has been reached. - * - * @param {Array} directives Array of collected directives to execute their compile function. - * this needs to be pre-sorted by priority order. - * @param {Node} compileNode The raw DOM node to apply the compile functions to - * @param {Object} templateAttrs The shared attribute function - * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the - * scope argument is auto-generated to the new - * child of the transcluded parent scope. - * @param {JQLite} jqCollection If we are working on the root of the compile tree then this - * argument has the root jqLite array so that we can replace nodes - * on it. - * @param {Object=} originalReplaceDirective An optional directive that will be ignored when - * compiling the transclusion. - * @param {Array.} preLinkFns - * @param {Array.} postLinkFns - * @param {Object} previousCompileContext Context used for previous compilation of the current - * node - * @returns {Function} linkFn - */ - function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, - jqCollection, originalReplaceDirective, preLinkFns, postLinkFns, - previousCompileContext) { - previousCompileContext = previousCompileContext || {}; - - var terminalPriority = -Number.MAX_VALUE, - newScopeDirective, - controllerDirectives = previousCompileContext.controllerDirectives, - controllers, - newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective, - templateDirective = previousCompileContext.templateDirective, - nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective, - hasTranscludeDirective = false, - hasTemplate = false, - hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective, - $compileNode = templateAttrs.$$element = jqLite(compileNode), - directive, - directiveName, - $template, - replaceDirective = originalReplaceDirective, - childTranscludeFn = transcludeFn, - linkFn, - directiveValue; - - // executes all directives on the current element - for (var i = 0, ii = directives.length; i < ii; i++) { - directive = directives[i]; - var attrStart = directive.$$start; - var attrEnd = directive.$$end; - - // collect multiblock sections - if (attrStart) { - $compileNode = groupScan(compileNode, attrStart, attrEnd); - } - $template = undefined; - - if (terminalPriority > directive.priority) { - break; // prevent further processing of directives - } - - if (directiveValue = directive.scope) { - - // skip the check for directives with async templates, we'll check the derived sync - // directive when the template arrives - if (!directive.templateUrl) { - if (isObject(directiveValue)) { - // This directive is trying to add an isolated scope. - // Check that there is no scope of any kind already - assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective, - directive, $compileNode); - newIsolateScopeDirective = directive; - } else { - // This directive is trying to add a child scope. - // Check that there is no isolated scope already - assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive, - $compileNode); - } - } - - newScopeDirective = newScopeDirective || directive; - } - - directiveName = directive.name; - - if (!directive.templateUrl && directive.controller) { - directiveValue = directive.controller; - controllerDirectives = controllerDirectives || {}; - assertNoDuplicate("'" + directiveName + "' controller", - controllerDirectives[directiveName], directive, $compileNode); - controllerDirectives[directiveName] = directive; - } - - if (directiveValue = directive.transclude) { - hasTranscludeDirective = true; - - // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion. - // This option should only be used by directives that know how to safely handle element transclusion, - // where the transcluded nodes are added or replaced after linking. - if (!directive.$$tlb) { - assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode); - nonTlbTranscludeDirective = directive; - } - - if (directiveValue == 'element') { - hasElementTranscludeDirective = true; - terminalPriority = directive.priority; - $template = $compileNode; - $compileNode = templateAttrs.$$element = - jqLite(document.createComment(' ' + directiveName + ': ' + - templateAttrs[directiveName] + ' ')); - compileNode = $compileNode[0]; - replaceWith(jqCollection, sliceArgs($template), compileNode); - - childTranscludeFn = compile($template, transcludeFn, terminalPriority, - replaceDirective && replaceDirective.name, { - // Don't pass in: - // - controllerDirectives - otherwise we'll create duplicates controllers - // - newIsolateScopeDirective or templateDirective - combining templates with - // element transclusion doesn't make sense. - // - // We need only nonTlbTranscludeDirective so that we prevent putting transclusion - // on the same element more than once. - nonTlbTranscludeDirective: nonTlbTranscludeDirective - }); - } else { - $template = jqLite(jqLiteClone(compileNode)).contents(); - $compileNode.empty(); // clear contents - childTranscludeFn = compile($template, transcludeFn); - } - } - - if (directive.template) { - hasTemplate = true; - assertNoDuplicate('template', templateDirective, directive, $compileNode); - templateDirective = directive; - - directiveValue = (isFunction(directive.template)) - ? directive.template($compileNode, templateAttrs) - : directive.template; - - directiveValue = denormalizeTemplate(directiveValue); - - if (directive.replace) { - replaceDirective = directive; - if (jqLiteIsTextNode(directiveValue)) { - $template = []; - } else { - $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue))); - } - compileNode = $template[0]; - - if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { - throw $compileMinErr('tplrt', - "Template for directive '{0}' must have exactly one root element. {1}", - directiveName, ''); - } - - replaceWith(jqCollection, $compileNode, compileNode); - - var newTemplateAttrs = {$attr: {}}; - - // combine directives from the original node and from the template: - // - take the array of directives for this element - // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed) - // - collect directives from the template and sort them by priority - // - combine directives as: processed + template + unprocessed - var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs); - var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1)); - - if (newIsolateScopeDirective) { - markDirectivesAsIsolate(templateDirectives); - } - directives = directives.concat(templateDirectives).concat(unprocessedDirectives); - mergeTemplateAttributes(templateAttrs, newTemplateAttrs); - - ii = directives.length; - } else { - $compileNode.html(directiveValue); - } - } - - if (directive.templateUrl) { - hasTemplate = true; - assertNoDuplicate('template', templateDirective, directive, $compileNode); - templateDirective = directive; - - if (directive.replace) { - replaceDirective = directive; - } - - nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode, - templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, { - controllerDirectives: controllerDirectives, - newIsolateScopeDirective: newIsolateScopeDirective, - templateDirective: templateDirective, - nonTlbTranscludeDirective: nonTlbTranscludeDirective - }); - ii = directives.length; - } else if (directive.compile) { - try { - linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); - if (isFunction(linkFn)) { - addLinkFns(null, linkFn, attrStart, attrEnd); - } else if (linkFn) { - addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd); - } - } catch (e) { - $exceptionHandler(e, startingTag($compileNode)); - } - } - - if (directive.terminal) { - nodeLinkFn.terminal = true; - terminalPriority = Math.max(terminalPriority, directive.priority); - } - - } - - nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true; - nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective; - nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective; - nodeLinkFn.templateOnThisElement = hasTemplate; - nodeLinkFn.transclude = childTranscludeFn; - - previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective; - - // might be normal or delayed nodeLinkFn depending on if templateUrl is present - return nodeLinkFn; - - //////////////////// - - function addLinkFns(pre, post, attrStart, attrEnd) { - if (pre) { - if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd); - pre.require = directive.require; - pre.directiveName = directiveName; - if (newIsolateScopeDirective === directive || directive.$$isolateScope) { - pre = cloneAndAnnotateFn(pre, {isolateScope: true}); - } - preLinkFns.push(pre); - } - if (post) { - if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd); - post.require = directive.require; - post.directiveName = directiveName; - if (newIsolateScopeDirective === directive || directive.$$isolateScope) { - post = cloneAndAnnotateFn(post, {isolateScope: true}); - } - postLinkFns.push(post); - } - } - - - function getControllers(directiveName, require, $element, elementControllers) { - var value, retrievalMethod = 'data', optional = false; - var $searchElement = $element; - var match; - if (isString(require)) { - match = require.match(REQUIRE_PREFIX_REGEXP); - require = require.substring(match[0].length); - - if (match[3]) { - if (match[1]) match[3] = null; - else match[1] = match[3]; - } - if (match[1] === '^') { - retrievalMethod = 'inheritedData'; - } else if (match[1] === '^^') { - retrievalMethod = 'inheritedData'; - $searchElement = $element.parent(); - } - if (match[2] === '?') { - optional = true; - } - - value = null; - - if (elementControllers && retrievalMethod === 'data') { - if (value = elementControllers[require]) { - value = value.instance; - } - } - value = value || $searchElement[retrievalMethod]('$' + require + 'Controller'); - - if (!value && !optional) { - throw $compileMinErr('ctreq', - "Controller '{0}', required by directive '{1}', can't be found!", - require, directiveName); - } - return value || null; - } else if (isArray(require)) { - value = []; - forEach(require, function(require) { - value.push(getControllers(directiveName, require, $element, elementControllers)); - }); - } - return value; - } - - - function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { - var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element, - attrs; - - if (compileNode === linkNode) { - attrs = templateAttrs; - $element = templateAttrs.$$element; - } else { - $element = jqLite(linkNode); - attrs = new Attributes($element, templateAttrs); - } - - if (newIsolateScopeDirective) { - isolateScope = scope.$new(true); - } - - if (boundTranscludeFn) { - // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn` - // is later passed as `parentBoundTranscludeFn` to `publicLinkFn` - transcludeFn = controllersBoundTransclude; - transcludeFn.$$boundTransclude = boundTranscludeFn; - } - - if (controllerDirectives) { - // TODO: merge `controllers` and `elementControllers` into single object. - controllers = {}; - elementControllers = {}; - forEach(controllerDirectives, function(directive) { - var locals = { - $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope, - $element: $element, - $attrs: attrs, - $transclude: transcludeFn - }, controllerInstance; - - controller = directive.controller; - if (controller == '@') { - controller = attrs[directive.name]; - } - - controllerInstance = $controller(controller, locals, true, directive.controllerAs); - - // For directives with element transclusion the element is a comment, - // but jQuery .data doesn't support attaching data to comment nodes as it's hard to - // clean up (http://bugs.jquery.com/ticket/8335). - // Instead, we save the controllers for the element in a local hash and attach to .data - // later, once we have the actual element. - elementControllers[directive.name] = controllerInstance; - if (!hasElementTranscludeDirective) { - $element.data('$' + directive.name + 'Controller', controllerInstance.instance); - } - - controllers[directive.name] = controllerInstance; - }); - } - - if (newIsolateScopeDirective) { - compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective || - templateDirective === newIsolateScopeDirective.$$originalDirective))); - compile.$$addScopeClass($element, true); - - var isolateScopeController = controllers && controllers[newIsolateScopeDirective.name]; - var isolateBindingContext = isolateScope; - if (isolateScopeController && isolateScopeController.identifier && - newIsolateScopeDirective.bindToController === true) { - isolateBindingContext = isolateScopeController.instance; - } - - forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) { - var attrName = definition.attrName, - optional = definition.optional, - mode = definition.mode, // @, =, or & - lastValue, - parentGet, parentSet, compare; - - switch (mode) { - - case '@': - attrs.$observe(attrName, function(value) { - isolateBindingContext[scopeName] = value; - }); - attrs.$$observers[attrName].$$scope = scope; - if (attrs[attrName]) { - // If the attribute has been provided then we trigger an interpolation to ensure - // the value is there for use in the link fn - isolateBindingContext[scopeName] = $interpolate(attrs[attrName])(scope); - } - break; - - case '=': - if (optional && !attrs[attrName]) { - return; - } - parentGet = $parse(attrs[attrName]); - if (parentGet.literal) { - compare = equals; - } else { - compare = function(a, b) { return a === b || (a !== a && b !== b); }; - } - parentSet = parentGet.assign || function() { - // reset the change, or we will throw this exception on every $digest - lastValue = isolateBindingContext[scopeName] = parentGet(scope); - throw $compileMinErr('nonassign', - "Expression '{0}' used with directive '{1}' is non-assignable!", - attrs[attrName], newIsolateScopeDirective.name); - }; - lastValue = isolateBindingContext[scopeName] = parentGet(scope); - var parentValueWatch = function parentValueWatch(parentValue) { - if (!compare(parentValue, isolateBindingContext[scopeName])) { - // we are out of sync and need to copy - if (!compare(parentValue, lastValue)) { - // parent changed and it has precedence - isolateBindingContext[scopeName] = parentValue; - } else { - // if the parent can be assigned then do so - parentSet(scope, parentValue = isolateBindingContext[scopeName]); - } - } - return lastValue = parentValue; - }; - parentValueWatch.$stateful = true; - var unwatch; - if (definition.collection) { - unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch); - } else { - unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal); - } - isolateScope.$on('$destroy', unwatch); - break; - - case '&': - parentGet = $parse(attrs[attrName]); - isolateBindingContext[scopeName] = function(locals) { - return parentGet(scope, locals); - }; - break; - } - }); - } - if (controllers) { - forEach(controllers, function(controller) { - controller(); - }); - controllers = null; - } - - // PRELINKING - for (i = 0, ii = preLinkFns.length; i < ii; i++) { - linkFn = preLinkFns[i]; - invokeLinkFn(linkFn, - linkFn.isolateScope ? isolateScope : scope, - $element, - attrs, - linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), - transcludeFn - ); - } - - // RECURSION - // We only pass the isolate scope, if the isolate directive has a template, - // otherwise the child elements do not belong to the isolate directive. - var scopeToChild = scope; - if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) { - scopeToChild = isolateScope; - } - childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn); - - // POSTLINKING - for (i = postLinkFns.length - 1; i >= 0; i--) { - linkFn = postLinkFns[i]; - invokeLinkFn(linkFn, - linkFn.isolateScope ? isolateScope : scope, - $element, - attrs, - linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), - transcludeFn - ); - } - - // This is the function that is injected as `$transclude`. - // Note: all arguments are optional! - function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) { - var transcludeControllers; - - // No scope passed in: - if (!isScope(scope)) { - futureParentElement = cloneAttachFn; - cloneAttachFn = scope; - scope = undefined; - } - - if (hasElementTranscludeDirective) { - transcludeControllers = elementControllers; - } - if (!futureParentElement) { - futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element; - } - return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild); - } - } - } - - function markDirectivesAsIsolate(directives) { - // mark all directives as needing isolate scope. - for (var j = 0, jj = directives.length; j < jj; j++) { - directives[j] = inherit(directives[j], {$$isolateScope: true}); - } - } - - /** - * looks up the directive and decorates it with exception handling and proper parameters. We - * call this the boundDirective. - * - * @param {string} name name of the directive to look up. - * @param {string} location The directive must be found in specific format. - * String containing any of theses characters: - * - * * `E`: element name - * * `A': attribute - * * `C`: class - * * `M`: comment - * @returns {boolean} true if directive was added. - */ - function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName, - endAttrName) { - if (name === ignoreDirective) return null; - var match = null; - if (hasDirectives.hasOwnProperty(name)) { - for (var directive, directives = $injector.get(name + Suffix), - i = 0, ii = directives.length; i < ii; i++) { - try { - directive = directives[i]; - if ((maxPriority === undefined || maxPriority > directive.priority) && - directive.restrict.indexOf(location) != -1) { - if (startAttrName) { - directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName}); - } - tDirectives.push(directive); - match = directive; - } - } catch (e) { $exceptionHandler(e); } - } - } - return match; - } - - - /** - * looks up the directive and returns true if it is a multi-element directive, - * and therefore requires DOM nodes between -start and -end markers to be grouped - * together. - * - * @param {string} name name of the directive to look up. - * @returns true if directive was registered as multi-element. - */ - function directiveIsMultiElement(name) { - if (hasDirectives.hasOwnProperty(name)) { - for (var directive, directives = $injector.get(name + Suffix), - i = 0, ii = directives.length; i < ii; i++) { - directive = directives[i]; - if (directive.multiElement) { - return true; - } - } - } - return false; - } - - /** - * When the element is replaced with HTML template then the new attributes - * on the template need to be merged with the existing attributes in the DOM. - * The desired effect is to have both of the attributes present. - * - * @param {object} dst destination attributes (original DOM) - * @param {object} src source attributes (from the directive template) - */ - function mergeTemplateAttributes(dst, src) { - var srcAttr = src.$attr, - dstAttr = dst.$attr, - $element = dst.$$element; - - // reapply the old attributes to the new element - forEach(dst, function(value, key) { - if (key.charAt(0) != '$') { - if (src[key] && src[key] !== value) { - value += (key === 'style' ? ';' : ' ') + src[key]; - } - dst.$set(key, value, true, srcAttr[key]); - } - }); - - // copy the new attributes on the old attrs object - forEach(src, function(value, key) { - if (key == 'class') { - safeAddClass($element, value); - dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; - } else if (key == 'style') { - $element.attr('style', $element.attr('style') + ';' + value); - dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value; - // `dst` will never contain hasOwnProperty as DOM parser won't let it. - // You will get an "InvalidCharacterError: DOM Exception 5" error if you - // have an attribute like "has-own-property" or "data-has-own-property", etc. - } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { - dst[key] = value; - dstAttr[key] = srcAttr[key]; - } - }); - } - - - function compileTemplateUrl(directives, $compileNode, tAttrs, - $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) { - var linkQueue = [], - afterTemplateNodeLinkFn, - afterTemplateChildLinkFn, - beforeTemplateCompileNode = $compileNode[0], - origAsyncDirective = directives.shift(), - derivedSyncDirective = inherit(origAsyncDirective, { - templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective - }), - templateUrl = (isFunction(origAsyncDirective.templateUrl)) - ? origAsyncDirective.templateUrl($compileNode, tAttrs) - : origAsyncDirective.templateUrl, - templateNamespace = origAsyncDirective.templateNamespace; - - $compileNode.empty(); - - $templateRequest($sce.getTrustedResourceUrl(templateUrl)) - .then(function(content) { - var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn; - - content = denormalizeTemplate(content); - - if (origAsyncDirective.replace) { - if (jqLiteIsTextNode(content)) { - $template = []; - } else { - $template = removeComments(wrapTemplate(templateNamespace, trim(content))); - } - compileNode = $template[0]; - - if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) { - throw $compileMinErr('tplrt', - "Template for directive '{0}' must have exactly one root element. {1}", - origAsyncDirective.name, templateUrl); - } - - tempTemplateAttrs = {$attr: {}}; - replaceWith($rootElement, $compileNode, compileNode); - var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs); - - if (isObject(origAsyncDirective.scope)) { - markDirectivesAsIsolate(templateDirectives); - } - directives = templateDirectives.concat(directives); - mergeTemplateAttributes(tAttrs, tempTemplateAttrs); - } else { - compileNode = beforeTemplateCompileNode; - $compileNode.html(content); - } - - directives.unshift(derivedSyncDirective); - - afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, - childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns, - previousCompileContext); - forEach($rootElement, function(node, i) { - if (node == compileNode) { - $rootElement[i] = $compileNode[0]; - } - }); - afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn); - - while (linkQueue.length) { - var scope = linkQueue.shift(), - beforeTemplateLinkNode = linkQueue.shift(), - linkRootElement = linkQueue.shift(), - boundTranscludeFn = linkQueue.shift(), - linkNode = $compileNode[0]; - - if (scope.$$destroyed) continue; - - if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { - var oldClasses = beforeTemplateLinkNode.className; - - if (!(previousCompileContext.hasElementTranscludeDirective && - origAsyncDirective.replace)) { - // it was cloned therefore we have to clone as well. - linkNode = jqLiteClone(compileNode); - } - replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); - - // Copy in CSS classes from original node - safeAddClass(jqLite(linkNode), oldClasses); - } - if (afterTemplateNodeLinkFn.transcludeOnThisElement) { - childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); - } else { - childBoundTranscludeFn = boundTranscludeFn; - } - afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, - childBoundTranscludeFn); - } - linkQueue = null; - }); - - return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) { - var childBoundTranscludeFn = boundTranscludeFn; - if (scope.$$destroyed) return; - if (linkQueue) { - linkQueue.push(scope, - node, - rootElement, - childBoundTranscludeFn); - } else { - if (afterTemplateNodeLinkFn.transcludeOnThisElement) { - childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn); - } - afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn); - } - }; - } - - - /** - * Sorting function for bound directives. - */ - function byPriority(a, b) { - var diff = b.priority - a.priority; - if (diff !== 0) return diff; - if (a.name !== b.name) return (a.name < b.name) ? -1 : 1; - return a.index - b.index; - } - - - function assertNoDuplicate(what, previousDirective, directive, element) { - if (previousDirective) { - throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}', - previousDirective.name, directive.name, what, startingTag(element)); - } - } - - - function addTextInterpolateDirective(directives, text) { - var interpolateFn = $interpolate(text, true); - if (interpolateFn) { - directives.push({ - priority: 0, - compile: function textInterpolateCompileFn(templateNode) { - var templateNodeParent = templateNode.parent(), - hasCompileParent = !!templateNodeParent.length; - - // When transcluding a template that has bindings in the root - // we don't have a parent and thus need to add the class during linking fn. - if (hasCompileParent) compile.$$addBindingClass(templateNodeParent); - - return function textInterpolateLinkFn(scope, node) { - var parent = node.parent(); - if (!hasCompileParent) compile.$$addBindingClass(parent); - compile.$$addBindingInfo(parent, interpolateFn.expressions); - scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { - node[0].nodeValue = value; - }); - }; - } - }); - } - } - - - function wrapTemplate(type, template) { - type = lowercase(type || 'html'); - switch (type) { - case 'svg': - case 'math': - var wrapper = document.createElement('div'); - wrapper.innerHTML = '<' + type + '>' + template + ''; - return wrapper.childNodes[0].childNodes; - default: - return template; - } - } - - - function getTrustedContext(node, attrNormalizedName) { - if (attrNormalizedName == "srcdoc") { - return $sce.HTML; - } - var tag = nodeName_(node); - // maction[xlink:href] can source SVG. It's not limited to . - if (attrNormalizedName == "xlinkHref" || - (tag == "form" && attrNormalizedName == "action") || - (tag != "img" && (attrNormalizedName == "src" || - attrNormalizedName == "ngSrc"))) { - return $sce.RESOURCE_URL; - } - } - - - function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) { - var trustedContext = getTrustedContext(node, name); - allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing; - - var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing); - - // no interpolation found -> ignore - if (!interpolateFn) return; - - - if (name === "multiple" && nodeName_(node) === "select") { - throw $compileMinErr("selmulti", - "Binding to the 'multiple' attribute is not supported. Element: {0}", - startingTag(node)); - } - - directives.push({ - priority: 100, - compile: function() { - return { - pre: function attrInterpolatePreLinkFn(scope, element, attr) { - var $$observers = (attr.$$observers || (attr.$$observers = {})); - - if (EVENT_HANDLER_ATTR_REGEXP.test(name)) { - throw $compileMinErr('nodomevents', - "Interpolations for HTML DOM event attributes are disallowed. Please use the " + - "ng- versions (such as ng-click instead of onclick) instead."); - } - - // If the attribute has changed since last $interpolate()ed - var newValue = attr[name]; - if (newValue !== value) { - // we need to interpolate again since the attribute value has been updated - // (e.g. by another directive's compile function) - // ensure unset/empty values make interpolateFn falsy - interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing); - value = newValue; - } - - // if attribute was updated so that there is no interpolation going on we don't want to - // register any observers - if (!interpolateFn) return; - - // initialize attr object so that it's ready in case we need the value for isolate - // scope initialization, otherwise the value would not be available from isolate - // directive's linking fn during linking phase - attr[name] = interpolateFn(scope); - - ($$observers[name] || ($$observers[name] = [])).$$inter = true; - (attr.$$observers && attr.$$observers[name].$$scope || scope). - $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) { - //special case for class attribute addition + removal - //so that class changes can tap into the animation - //hooks provided by the $animate service. Be sure to - //skip animations when the first digest occurs (when - //both the new and the old values are the same) since - //the CSS classes are the non-interpolated values - if (name === 'class' && newValue != oldValue) { - attr.$updateClass(newValue, oldValue); - } else { - attr.$set(name, newValue); - } - }); - } - }; - } - }); - } - - - /** - * This is a special jqLite.replaceWith, which can replace items which - * have no parents, provided that the containing jqLite collection is provided. - * - * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes - * in the root of the tree. - * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep - * the shell, but replace its DOM node reference. - * @param {Node} newNode The new DOM node. - */ - function replaceWith($rootElement, elementsToRemove, newNode) { - var firstElementToRemove = elementsToRemove[0], - removeCount = elementsToRemove.length, - parent = firstElementToRemove.parentNode, - i, ii; - - if ($rootElement) { - for (i = 0, ii = $rootElement.length; i < ii; i++) { - if ($rootElement[i] == firstElementToRemove) { - $rootElement[i++] = newNode; - for (var j = i, j2 = j + removeCount - 1, - jj = $rootElement.length; - j < jj; j++, j2++) { - if (j2 < jj) { - $rootElement[j] = $rootElement[j2]; - } else { - delete $rootElement[j]; - } - } - $rootElement.length -= removeCount - 1; - - // If the replaced element is also the jQuery .context then replace it - // .context is a deprecated jQuery api, so we should set it only when jQuery set it - // http://api.jquery.com/context/ - if ($rootElement.context === firstElementToRemove) { - $rootElement.context = newNode; - } - break; - } - } - } - - if (parent) { - parent.replaceChild(newNode, firstElementToRemove); - } - - // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it? - var fragment = document.createDocumentFragment(); - fragment.appendChild(firstElementToRemove); - - // Copy over user data (that includes Angular's $scope etc.). Don't copy private - // data here because there's no public interface in jQuery to do that and copying over - // event listeners (which is the main use of private data) wouldn't work anyway. - jqLite(newNode).data(jqLite(firstElementToRemove).data()); - - // Remove data of the replaced element. We cannot just call .remove() - // on the element it since that would deallocate scope that is needed - // for the new node. Instead, remove the data "manually". - if (!jQuery) { - delete jqLite.cache[firstElementToRemove[jqLite.expando]]; - } else { - // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after - // the replaced element. The cleanData version monkey-patched by Angular would cause - // the scope to be trashed and we do need the very same scope to work with the new - // element. However, we cannot just cache the non-patched version and use it here as - // that would break if another library patches the method after Angular does (one - // example is jQuery UI). Instead, set a flag indicating scope destroying should be - // skipped this one time. - skipDestroyOnNextJQueryCleanData = true; - jQuery.cleanData([firstElementToRemove]); - } - - for (var k = 1, kk = elementsToRemove.length; k < kk; k++) { - var element = elementsToRemove[k]; - jqLite(element).remove(); // must do this way to clean up expando - fragment.appendChild(element); - delete elementsToRemove[k]; - } - - elementsToRemove[0] = newNode; - elementsToRemove.length = 1; - } - - - function cloneAndAnnotateFn(fn, annotation) { - return extend(function() { return fn.apply(null, arguments); }, fn, annotation); - } - - - function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) { - try { - linkFn(scope, $element, attrs, controllers, transcludeFn); - } catch (e) { - $exceptionHandler(e, startingTag($element)); - } - } - }]; -} - -var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i; -/** - * Converts all accepted directives format into proper directive name. - * @param name Name to normalize - */ -function directiveNormalize(name) { - return camelCase(name.replace(PREFIX_REGEXP, '')); -} - -/** - * @ngdoc type - * @name $compile.directive.Attributes - * - * @description - * A shared object between directive compile / linking functions which contains normalized DOM - * element attributes. The values reflect current binding state `{{ }}`. The normalization is - * needed since all of these are treated as equivalent in Angular: - * - * ``` - * - * ``` - */ - -/** - * @ngdoc property - * @name $compile.directive.Attributes#$attr - * - * @description - * A map of DOM element attribute names to the normalized name. This is - * needed to do reverse lookup from normalized name back to actual name. - */ - - -/** - * @ngdoc method - * @name $compile.directive.Attributes#$set - * @kind function - * - * @description - * Set DOM element attribute value. - * - * - * @param {string} name Normalized element attribute name of the property to modify. The name is - * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr} - * property to the original name. - * @param {string} value Value to set the attribute to. The value can be an interpolated string. - */ - - - -/** - * Closure compiler type information - */ - -function nodesetLinkingFn( - /* angular.Scope */ scope, - /* NodeList */ nodeList, - /* Element */ rootElement, - /* function(Function) */ boundTranscludeFn -) {} - -function directiveLinkingFn( - /* nodesetLinkingFn */ nodesetLinkingFn, - /* angular.Scope */ scope, - /* Node */ node, - /* Element */ rootElement, - /* function(Function) */ boundTranscludeFn -) {} - -function tokenDifference(str1, str2) { - var values = '', - tokens1 = str1.split(/\s+/), - tokens2 = str2.split(/\s+/); - - outer: - for (var i = 0; i < tokens1.length; i++) { - var token = tokens1[i]; - for (var j = 0; j < tokens2.length; j++) { - if (token == tokens2[j]) continue outer; - } - values += (values.length > 0 ? ' ' : '') + token; - } - return values; -} - -function removeComments(jqNodes) { - jqNodes = jqLite(jqNodes); - var i = jqNodes.length; - - if (i <= 1) { - return jqNodes; - } - - while (i--) { - var node = jqNodes[i]; - if (node.nodeType === NODE_TYPE_COMMENT) { - splice.call(jqNodes, i, 1); - } - } - return jqNodes; -} - -var $controllerMinErr = minErr('$controller'); - -/** - * @ngdoc provider - * @name $controllerProvider - * @description - * The {@link ng.$controller $controller service} is used by Angular to create new - * controllers. - * - * This provider allows controller registration via the - * {@link ng.$controllerProvider#register register} method. - */ -function $ControllerProvider() { - var controllers = {}, - globals = false, - CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/; - - - /** - * @ngdoc method - * @name $controllerProvider#register - * @param {string|Object} name Controller name, or an object map of controllers where the keys are - * the names and the values are the constructors. - * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI - * annotations in the array notation). - */ - this.register = function(name, constructor) { - assertNotHasOwnProperty(name, 'controller'); - if (isObject(name)) { - extend(controllers, name); - } else { - controllers[name] = constructor; - } - }; - - /** - * @ngdoc method - * @name $controllerProvider#allowGlobals - * @description If called, allows `$controller` to find controller constructors on `window` - */ - this.allowGlobals = function() { - globals = true; - }; - - - this.$get = ['$injector', '$window', function($injector, $window) { - - /** - * @ngdoc service - * @name $controller - * @requires $injector - * - * @param {Function|string} constructor If called with a function then it's considered to be the - * controller constructor function. Otherwise it's considered to be a string which is used - * to retrieve the controller constructor using the following steps: - * - * * check if a controller with given name is registered via `$controllerProvider` - * * check if evaluating the string on the current scope returns a constructor - * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global - * `window` object (not recommended) - * - * The string can use the `controller as property` syntax, where the controller instance is published - * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this - * to work correctly. - * - * @param {Object} locals Injection locals for Controller. - * @return {Object} Instance of given controller. - * - * @description - * `$controller` service is responsible for instantiating controllers. - * - * It's just a simple call to {@link auto.$injector $injector}, but extracted into - * a service, so that one can override this service with [BC version](https://gist.github.com/1649788). - */ - return function(expression, locals, later, ident) { - // PRIVATE API: - // param `later` --- indicates that the controller's constructor is invoked at a later time. - // If true, $controller will allocate the object with the correct - // prototype chain, but will not invoke the controller until a returned - // callback is invoked. - // param `ident` --- An optional label which overrides the label parsed from the controller - // expression, if any. - var instance, match, constructor, identifier; - later = later === true; - if (ident && isString(ident)) { - identifier = ident; - } - - if (isString(expression)) { - match = expression.match(CNTRL_REG); - if (!match) { - throw $controllerMinErr('ctrlfmt', - "Badly formed controller string '{0}'. " + - "Must match `__name__ as __id__` or `__name__`.", expression); - } - constructor = match[1], - identifier = identifier || match[3]; - expression = controllers.hasOwnProperty(constructor) - ? controllers[constructor] - : getter(locals.$scope, constructor, true) || - (globals ? getter($window, constructor, true) : undefined); - - assertArgFn(expression, constructor, true); - } - - if (later) { - // Instantiate controller later: - // This machinery is used to create an instance of the object before calling the - // controller's constructor itself. - // - // This allows properties to be added to the controller before the constructor is - // invoked. Primarily, this is used for isolate scope bindings in $compile. - // - // This feature is not intended for use by applications, and is thus not documented - // publicly. - // Object creation: http://jsperf.com/create-constructor/2 - var controllerPrototype = (isArray(expression) ? - expression[expression.length - 1] : expression).prototype; - instance = Object.create(controllerPrototype || null); - - if (identifier) { - addIdentifier(locals, identifier, instance, constructor || expression.name); - } - - return extend(function() { - $injector.invoke(expression, instance, locals, constructor); - return instance; - }, { - instance: instance, - identifier: identifier - }); - } - - instance = $injector.instantiate(expression, locals, constructor); - - if (identifier) { - addIdentifier(locals, identifier, instance, constructor || expression.name); - } - - return instance; - }; - - function addIdentifier(locals, identifier, instance, name) { - if (!(locals && isObject(locals.$scope))) { - throw minErr('$controller')('noscp', - "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.", - name, identifier); - } - - locals.$scope[identifier] = instance; - } - }]; -} - -/** - * @ngdoc service - * @name $document - * @requires $window - * - * @description - * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object. - * - * @example - - -
    -

    $document title:

    -

    window.document title:

    -
    -
    - - angular.module('documentExample', []) - .controller('ExampleController', ['$scope', '$document', function($scope, $document) { - $scope.title = $document[0].title; - $scope.windowTitle = angular.element(window.document)[0].title; - }]); - -
    - */ -function $DocumentProvider() { - this.$get = ['$window', function(window) { - return jqLite(window.document); - }]; -} - -/** - * @ngdoc service - * @name $exceptionHandler - * @requires ng.$log - * - * @description - * Any uncaught exception in angular expressions is delegated to this service. - * The default implementation simply delegates to `$log.error` which logs it into - * the browser console. - * - * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by - * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. - * - * ## Example: - * - * ```js - * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() { - * return function(exception, cause) { - * exception.message += ' (caused by "' + cause + '")'; - * throw exception; - * }; - * }); - * ``` - * - * This example will override the normal action of `$exceptionHandler`, to make angular - * exceptions fail hard when they happen, instead of just logging to the console. - * - *
    - * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind` - * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler} - * (unless executed during a digest). - * - * If you wish, you can manually delegate exceptions, e.g. - * `try { ... } catch(e) { $exceptionHandler(e); }` - * - * @param {Error} exception Exception associated with the error. - * @param {string=} cause optional information about the context in which - * the error was thrown. - * - */ -function $ExceptionHandlerProvider() { - this.$get = ['$log', function($log) { - return function(exception, cause) { - $log.error.apply($log, arguments); - }; - }]; -} - -var APPLICATION_JSON = 'application/json'; -var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'}; -var JSON_START = /^\[|^\{(?!\{)/; -var JSON_ENDS = { - '[': /]$/, - '{': /}$/ -}; -var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/; - -function defaultHttpResponseTransform(data, headers) { - if (isString(data)) { - // Strip json vulnerability protection prefix and trim whitespace - var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim(); - - if (tempData) { - var contentType = headers('Content-Type'); - if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) { - data = fromJson(tempData); - } - } - } - - return data; -} - -function isJsonLike(str) { - var jsonStart = str.match(JSON_START); - return jsonStart && JSON_ENDS[jsonStart[0]].test(str); -} - -/** - * Parse headers into key value object - * - * @param {string} headers Raw headers as a string - * @returns {Object} Parsed headers as key value object - */ -function parseHeaders(headers) { - var parsed = createMap(), key, val, i; - - if (!headers) return parsed; - - forEach(headers.split('\n'), function(line) { - i = line.indexOf(':'); - key = lowercase(trim(line.substr(0, i))); - val = trim(line.substr(i + 1)); - - if (key) { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - }); - - return parsed; -} - - -/** - * Returns a function that provides access to parsed headers. - * - * Headers are lazy parsed when first requested. - * @see parseHeaders - * - * @param {(string|Object)} headers Headers to provide access to. - * @returns {function(string=)} Returns a getter function which if called with: - * - * - if called with single an argument returns a single header value or null - * - if called with no arguments returns an object containing all headers. - */ -function headersGetter(headers) { - var headersObj = isObject(headers) ? headers : undefined; - - return function(name) { - if (!headersObj) headersObj = parseHeaders(headers); - - if (name) { - var value = headersObj[lowercase(name)]; - if (value === void 0) { - value = null; - } - return value; - } - - return headersObj; - }; -} - - -/** - * Chain all given functions - * - * This function is used for both request and response transforming - * - * @param {*} data Data to transform. - * @param {function(string=)} headers HTTP headers getter fn. - * @param {number} status HTTP status code of the response. - * @param {(Function|Array.)} fns Function or an array of functions. - * @returns {*} Transformed data. - */ -function transformData(data, headers, status, fns) { - if (isFunction(fns)) - return fns(data, headers, status); - - forEach(fns, function(fn) { - data = fn(data, headers, status); - }); - - return data; -} - - -function isSuccess(status) { - return 200 <= status && status < 300; -} - - -/** - * @ngdoc provider - * @name $httpProvider - * @description - * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service. - * */ -function $HttpProvider() { - /** - * @ngdoc property - * @name $httpProvider#defaults - * @description - * - * Object containing default values for all {@link ng.$http $http} requests. - * - * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`} - * that will provide the cache for all requests who set their `cache` property to `true`. - * If you set the `default.cache = false` then only requests that specify their own custom - * cache object will be cached. See {@link $http#caching $http Caching} for more information. - * - * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token. - * Defaults value is `'XSRF-TOKEN'`. - * - * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the - * XSRF token. Defaults value is `'X-XSRF-TOKEN'`. - * - * - **`defaults.headers`** - {Object} - Default headers for all $http requests. - * Refer to {@link ng.$http#setting-http-headers $http} for documentation on - * setting default headers. - * - **`defaults.headers.common`** - * - **`defaults.headers.post`** - * - **`defaults.headers.put`** - * - **`defaults.headers.patch`** - * - **/ - var defaults = this.defaults = { - // transform incoming response data - transformResponse: [defaultHttpResponseTransform], - - // transform outgoing request data - transformRequest: [function(d) { - return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d; - }], - - // default headers - headers: { - common: { - 'Accept': 'application/json, text/plain, */*' - }, - post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), - put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON), - patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON) - }, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN' - }; - - // begin modify by wsp - var authenticationHeaders =FLOWABLE.CONFIG.getHttpRequestAuthenticationHeaders(); - if(authenticationHeaders){ - defaults.headers.common.Authorization=authenticationHeaders.headers.Authorization; - } - console.log(defaults); - - // end modify by wsp - - var useApplyAsync = false; - /** - * @ngdoc method - * @name $httpProvider#useApplyAsync - * @description - * - * Configure $http service to combine processing of multiple http responses received at around - * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in - * significant performance improvement for bigger applications that make many HTTP requests - * concurrently (common during application bootstrap). - * - * Defaults to false. If no value is specifed, returns the current configured value. - * - * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred - * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window - * to load and share the same digest cycle. - * - * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. - * otherwise, returns the current configured value. - **/ - this.useApplyAsync = function(value) { - if (isDefined(value)) { - useApplyAsync = !!value; - return this; - } - return useApplyAsync; - }; - - /** - * @ngdoc property - * @name $httpProvider#interceptors - * @description - * - * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http} - * pre-processing of request or postprocessing of responses. - * - * These service factories are ordered by request, i.e. they are applied in the same order as the - * array, on request, but reverse order, on response. - * - * {@link ng.$http#interceptors Interceptors detailed info} - **/ - var interceptorFactories = this.interceptors = []; - - this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', - function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) { - - var defaultCache = $cacheFactory('$http'); - - /** - * Interceptors stored in reverse order. Inner interceptors before outer interceptors. - * The reversal is needed so that we can build up the interception chain around the - * server request. - */ - var reversedInterceptors = []; - - forEach(interceptorFactories, function(interceptorFactory) { - reversedInterceptors.unshift(isString(interceptorFactory) - ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory)); - }); - - /** - * @ngdoc service - * @kind function - * @name $http - * @requires ng.$httpBackend - * @requires $cacheFactory - * @requires $rootScope - * @requires $q - * @requires $injector - * - * @description - * The `$http` service is a core Angular service that facilitates communication with the remote - * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest) - * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP). - * - * For unit testing applications that use `$http` service, see - * {@link ngMock.$httpBackend $httpBackend mock}. - * - * For a higher level of abstraction, please check out the {@link ngResource.$resource - * $resource} service. - * - * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by - * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage - * it is important to familiarize yourself with these APIs and the guarantees they provide. - * - * - * ## General usage - * The `$http` service is a function which takes a single argument — a configuration object — - * that is used to generate an HTTP request and returns a {@link ng.$q promise} - * with two $http specific methods: `success` and `error`. - * - * ```js - * // Simple GET request example : - * $http.get('/someUrl'). - * success(function(data, status, headers, config) { - * // this callback will be called asynchronously - * // when the response is available - * }). - * error(function(data, status, headers, config) { - * // called asynchronously if an error occurs - * // or server returns response with an error status. - * }); - * ``` - * - * ```js - * // Simple POST request example (passing data) : - * $http.post('/someUrl', {msg:'hello word!'}). - * success(function(data, status, headers, config) { - * // this callback will be called asynchronously - * // when the response is available - * }). - * error(function(data, status, headers, config) { - * // called asynchronously if an error occurs - * // or server returns response with an error status. - * }); - * ``` - * - * - * Since the returned value of calling the $http function is a `promise`, you can also use - * the `then` method to register callbacks, and these callbacks will receive a single argument – - * an object representing the response. See the API signature and type info below for more - * details. - * - * A response status code between 200 and 299 is considered a success status and - * will result in the success callback being called. Note that if the response is a redirect, - * XMLHttpRequest will transparently follow it, meaning that the error callback will not be - * called for such responses. - * - * ## Writing Unit Tests that use $http - * When unit testing (using {@link ngMock ngMock}), it is necessary to call - * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending - * request using trained responses. - * - * ``` - * $httpBackend.expectGET(...); - * $http.get(...); - * $httpBackend.flush(); - * ``` - * - * ## Shortcut methods - * - * Shortcut methods are also available. All shortcut methods require passing in the URL, and - * request data must be passed in for POST/PUT requests. - * - * ```js - * $http.get('/someUrl').success(successCallback); - * $http.post('/someUrl', data).success(successCallback); - * ``` - * - * Complete list of shortcut methods: - * - * - {@link ng.$http#get $http.get} - * - {@link ng.$http#head $http.head} - * - {@link ng.$http#post $http.post} - * - {@link ng.$http#put $http.put} - * - {@link ng.$http#delete $http.delete} - * - {@link ng.$http#jsonp $http.jsonp} - * - {@link ng.$http#patch $http.patch} - * - * - * ## Setting HTTP Headers - * - * The $http service will automatically add certain HTTP headers to all requests. These defaults - * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration - * object, which currently contains this default configuration: - * - * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): - * - `Accept: application/json, text/plain, * / *` - * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests) - * - `Content-Type: application/json` - * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests) - * - `Content-Type: application/json` - * - * To add or overwrite these defaults, simply add or remove a property from these configuration - * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object - * with the lowercased HTTP method name as the key, e.g. - * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }. - * - * The defaults can also be set at runtime via the `$http.defaults` object in the same - * fashion. For example: - * - * ``` - * module.run(function($http) { - * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w' - * }); - * ``` - * - * In addition, you can supply a `headers` property in the config object passed when - * calling `$http(config)`, which overrides the defaults without changing them globally. - * - * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis, - * Use the `headers` property, setting the desired header to `undefined`. For example: - * - * ```js - * var req = { - * method: 'POST', - * url: 'http://example.com', - * headers: { - * 'Content-Type': undefined - * }, - * data: { test: 'test' }, - * } - * - * $http(req).success(function(){...}).error(function(){...}); - * ``` - * - * ## Transforming Requests and Responses - * - * Both requests and responses can be transformed using transformation functions: `transformRequest` - * and `transformResponse`. These properties can be a single function that returns - * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions, - * which allows you to `push` or `unshift` a new transformation function into the transformation chain. - * - * ### Default Transformations - * - * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and - * `defaults.transformResponse` properties. If a request does not provide its own transformations - * then these will be applied. - * - * You can augment or replace the default transformations by modifying these properties by adding to or - * replacing the array. - * - * Angular provides the following default transformations: - * - * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`): - * - * - If the `data` property of the request configuration object contains an object, serialize it - * into JSON format. - * - * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`): - * - * - If XSRF prefix is detected, strip it (see Security Considerations section below). - * - If JSON response is detected, deserialize it using a JSON parser. - * - * - * ### Overriding the Default Transformations Per Request - * - * If you wish override the request/response transformations only for a single request then provide - * `transformRequest` and/or `transformResponse` properties on the configuration object passed - * into `$http`. - * - * Note that if you provide these properties on the config object the default transformations will be - * overwritten. If you wish to augment the default transformations then you must include them in your - * local transformation array. - * - * The following code demonstrates adding a new response transformation to be run after the default response - * transformations have been run. - * - * ```js - * function appendTransform(defaults, transform) { - * - * // We can't guarantee that the default transformation is an array - * defaults = angular.isArray(defaults) ? defaults : [defaults]; - * - * // Append the new transformation to the defaults - * return defaults.concat(transform); - * } - * - * $http({ - * url: '...', - * method: 'GET', - * transformResponse: appendTransform($http.defaults.transformResponse, function(value) { - * return doTransform(value); - * }) - * }); - * ``` - * - * - * ## Caching - * - * To enable caching, set the request configuration `cache` property to `true` (to use default - * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}). - * When the cache is enabled, `$http` stores the response from the server in the specified - * cache. The next time the same request is made, the response is served from the cache without - * sending a request to the server. - * - * Note that even if the response is served from cache, delivery of the data is asynchronous in - * the same way that real requests are. - * - * If there are multiple GET requests for the same URL that should be cached using the same - * cache, but the cache is not populated yet, only one request to the server will be made and - * the remaining requests will be fulfilled using the response from the first request. - * - * You can change the default cache to a new object (built with - * {@link ng.$cacheFactory `$cacheFactory`}) by updating the - * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set - * their `cache` property to `true` will now use this cache object. - * - * If you set the default cache to `false` then only requests that specify their own custom - * cache object will be cached. - * - * ## Interceptors - * - * Before you start creating interceptors, be sure to understand the - * {@link ng.$q $q and deferred/promise APIs}. - * - * For purposes of global error handling, authentication, or any kind of synchronous or - * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be - * able to intercept requests before they are handed to the server and - * responses before they are handed over to the application code that - * initiated these requests. The interceptors leverage the {@link ng.$q - * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing. - * - * The interceptors are service factories that are registered with the `$httpProvider` by - * adding them to the `$httpProvider.interceptors` array. The factory is called and - * injected with dependencies (if specified) and returns the interceptor. - * - * There are two kinds of interceptors (and two kinds of rejection interceptors): - * - * * `request`: interceptors get called with a http `config` object. The function is free to - * modify the `config` object or create a new one. The function needs to return the `config` - * object directly, or a promise containing the `config` or a new `config` object. - * * `requestError`: interceptor gets called when a previous interceptor threw an error or - * resolved with a rejection. - * * `response`: interceptors get called with http `response` object. The function is free to - * modify the `response` object or create a new one. The function needs to return the `response` - * object directly, or as a promise containing the `response` or a new `response` object. - * * `responseError`: interceptor gets called when a previous interceptor threw an error or - * resolved with a rejection. - * - * - * ```js - * // register the interceptor as a service - * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) { - * return { - * // optional method - * 'request': function(config) { - * // do something on success - * return config; - * }, - * - * // optional method - * 'requestError': function(rejection) { - * // do something on error - * if (canRecover(rejection)) { - * return responseOrNewPromise - * } - * return $q.reject(rejection); - * }, - * - * - * - * // optional method - * 'response': function(response) { - * // do something on success - * return response; - * }, - * - * // optional method - * 'responseError': function(rejection) { - * // do something on error - * if (canRecover(rejection)) { - * return responseOrNewPromise - * } - * return $q.reject(rejection); - * } - * }; - * }); - * - * $httpProvider.interceptors.push('myHttpInterceptor'); - * - * - * // alternatively, register the interceptor via an anonymous factory - * $httpProvider.interceptors.push(function($q, dependency1, dependency2) { - * return { - * 'request': function(config) { - * // same as above - * }, - * - * 'response': function(response) { - * // same as above - * } - * }; - * }); - * ``` - * - * ## Security Considerations - * - * When designing web applications, consider security threats from: - * - * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) - * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) - * - * Both server and the client must cooperate in order to eliminate these threats. Angular comes - * pre-configured with strategies that address these issues, but for this to work backend server - * cooperation is required. - * - * ### JSON Vulnerability Protection - * - * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) - * allows third party website to turn your JSON resource URL into - * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To - * counter this your server can prefix all JSON requests with following string `")]}',\n"`. - * Angular will automatically strip the prefix before processing it as JSON. - * - * For example if your server needs to return: - * ```js - * ['one','two'] - * ``` - * - * which is vulnerable to attack, your server can return: - * ```js - * )]}', - * ['one','two'] - * ``` - * - * Angular will strip the prefix, before processing the JSON. - * - * - * ### Cross Site Request Forgery (XSRF) Protection - * - * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which - * an unauthorized site can gain your user's private data. Angular provides a mechanism - * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie - * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only - * JavaScript that runs on your domain could read the cookie, your server can be assured that - * the XHR came from JavaScript running on your domain. The header will not be set for - * cross-domain requests. - * - * To take advantage of this, your server needs to set a token in a JavaScript readable session - * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the - * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure - * that only JavaScript running on your domain could have sent the request. The token must be - * unique for each user and must be verifiable by the server (to prevent the JavaScript from - * making up its own tokens). We recommend that the token is a digest of your site's - * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography)) - * for added security. - * - * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName - * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time, - * or the per-request config object. - * - * - * @param {object} config Object describing the request to be made and how it should be - * processed. The object has following properties: - * - * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) - * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. - * - **params** – `{Object.}` – Map of strings or objects which will be turned - * to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be - * JSONified. - * - **data** – `{string|Object}` – Data to be sent as the request message data. - * - **headers** – `{Object}` – Map of strings or functions which return strings representing - * HTTP headers to send to the server. If the return value of a function is null, the - * header will not be sent. - * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token. - * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token. - * - **transformRequest** – - * `{function(data, headersGetter)|Array.}` – - * transform function or an array of such functions. The transform function takes the http - * request body and headers and returns its transformed (typically serialized) version. - * See {@link ng.$http#overriding-the-default-transformations-per-request - * Overriding the Default Transformations} - * - **transformResponse** – - * `{function(data, headersGetter, status)|Array.}` – - * transform function or an array of such functions. The transform function takes the http - * response body, headers and status and returns its transformed (typically deserialized) version. - * See {@link ng.$http#overriding-the-default-transformations-per-request - * Overriding the Default Transformations} - * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the - * GET request, otherwise if a cache instance built with - * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for - * caching. - * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} - * that should abort the request when resolved. - * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the - * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials) - * for more information. - * - **responseType** - `{string}` - see - * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType). - * - * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the - * standard `then` method and two http specific methods: `success` and `error`. The `then` - * method takes two arguments a success and an error callback which will be called with a - * response object. The `success` and `error` methods take a single argument - a function that - * will be called when the request succeeds or fails respectively. The arguments passed into - * these functions are destructured representation of the response object passed into the - * `then` method. The response object has these properties: - * - * - **data** – `{string|Object}` – The response body transformed with the transform - * functions. - * - **status** – `{number}` – HTTP status code of the response. - * - **headers** – `{function([headerName])}` – Header getter function. - * - **config** – `{Object}` – The configuration object that was used to generate the request. - * - **statusText** – `{string}` – HTTP status text of the response. - * - * @property {Array.} pendingRequests Array of config objects for currently pending - * requests. This is primarily meant to be used for debugging purposes. - * - * - * @example - - -
    - - -
    - - - -
    http status code: {{status}}
    -
    http response data: {{data}}
    -
    -
    - - angular.module('httpExample', []) - .controller('FetchController', ['$scope', '$http', '$templateCache', - function($scope, $http, $templateCache) { - $scope.method = 'GET'; - $scope.url = 'http-hello.html'; - - $scope.fetch = function() { - $scope.code = null; - $scope.response = null; - - $http({method: $scope.method, url: $scope.url, cache: $templateCache}). - success(function(data, status) { - $scope.status = status; - $scope.data = data; - }). - error(function(data, status) { - $scope.data = data || "Request failed"; - $scope.status = status; - }); - }; - - $scope.updateModel = function(method, url) { - $scope.method = method; - $scope.url = url; - }; - }]); - - - Hello, $http! - - - var status = element(by.binding('status')); - var data = element(by.binding('data')); - var fetchBtn = element(by.id('fetchbtn')); - var sampleGetBtn = element(by.id('samplegetbtn')); - var sampleJsonpBtn = element(by.id('samplejsonpbtn')); - var invalidJsonpBtn = element(by.id('invalidjsonpbtn')); - - it('should make an xhr GET request', function() { - sampleGetBtn.click(); - fetchBtn.click(); - expect(status.getText()).toMatch('200'); - expect(data.getText()).toMatch(/Hello, \$http!/); - }); - -// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185 -// it('should make a JSONP request to angularjs.org', function() { -// sampleJsonpBtn.click(); -// fetchBtn.click(); -// expect(status.getText()).toMatch('200'); -// expect(data.getText()).toMatch(/Super Hero!/); -// }); - - it('should make JSONP request to invalid URL and invoke the error handler', - function() { - invalidJsonpBtn.click(); - fetchBtn.click(); - expect(status.getText()).toMatch('0'); - expect(data.getText()).toMatch('Request failed'); - }); - -
    - */ - function $http(requestConfig) { - - if (!angular.isObject(requestConfig)) { - throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig); - } - - var config = extend({ - method: 'get', - transformRequest: defaults.transformRequest, - transformResponse: defaults.transformResponse - }, requestConfig); - - config.headers = mergeHeaders(requestConfig); - config.method = uppercase(config.method); - - var serverRequest = function(config) { - var headers = config.headers; - var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest); - - // strip content-type if data is undefined - if (isUndefined(reqData)) { - forEach(headers, function(value, header) { - if (lowercase(header) === 'content-type') { - delete headers[header]; - } - }); - } - - if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) { - config.withCredentials = defaults.withCredentials; - } - - // send request - return sendReq(config, reqData).then(transformResponse, transformResponse); - }; - - var chain = [serverRequest, undefined]; - var promise = $q.when(config); - - // apply interceptors - forEach(reversedInterceptors, function(interceptor) { - if (interceptor.request || interceptor.requestError) { - chain.unshift(interceptor.request, interceptor.requestError); - } - if (interceptor.response || interceptor.responseError) { - chain.push(interceptor.response, interceptor.responseError); - } - }); - - while (chain.length) { - var thenFn = chain.shift(); - var rejectFn = chain.shift(); - - promise = promise.then(thenFn, rejectFn); - } - - promise.success = function(fn) { - promise.then(function(response) { - fn(response.data, response.status, response.headers, config); - }); - return promise; - }; - - promise.error = function(fn) { - promise.then(null, function(response) { - fn(response.data, response.status, response.headers, config); - }); - return promise; - }; - - return promise; - - function transformResponse(response) { - // make a copy since the response must be cacheable - var resp = extend({}, response); - if (!response.data) { - resp.data = response.data; - } else { - resp.data = transformData(response.data, response.headers, response.status, config.transformResponse); - } - return (isSuccess(response.status)) - ? resp - : $q.reject(resp); - } - - function executeHeaderFns(headers) { - var headerContent, processedHeaders = {}; - - forEach(headers, function(headerFn, header) { - if (isFunction(headerFn)) { - headerContent = headerFn(); - if (headerContent != null) { - processedHeaders[header] = headerContent; - } - } else { - processedHeaders[header] = headerFn; - } - }); - - return processedHeaders; - } - - function mergeHeaders(config) { - var defHeaders = defaults.headers, - reqHeaders = extend({}, config.headers), - defHeaderName, lowercaseDefHeaderName, reqHeaderName; - - defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]); - - // using for-in instead of forEach to avoid unecessary iteration after header has been found - defaultHeadersIteration: - for (defHeaderName in defHeaders) { - lowercaseDefHeaderName = lowercase(defHeaderName); - - for (reqHeaderName in reqHeaders) { - if (lowercase(reqHeaderName) === lowercaseDefHeaderName) { - continue defaultHeadersIteration; - } - } - - reqHeaders[defHeaderName] = defHeaders[defHeaderName]; - } - - // execute if header value is a function for merged headers - return executeHeaderFns(reqHeaders); - } - } - - $http.pendingRequests = []; - - /** - * @ngdoc method - * @name $http#get - * - * @description - * Shortcut method to perform `GET` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#delete - * - * @description - * Shortcut method to perform `DELETE` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#head - * - * @description - * Shortcut method to perform `HEAD` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#jsonp - * - * @description - * Shortcut method to perform `JSONP` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request. - * The name of the callback should be the string `JSON_CALLBACK`. - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - createShortMethods('get', 'delete', 'head', 'jsonp'); - - /** - * @ngdoc method - * @name $http#post - * - * @description - * Shortcut method to perform `POST` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#put - * - * @description - * Shortcut method to perform `PUT` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name $http#patch - * - * @description - * Shortcut method to perform `PATCH` request. - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - createShortMethodsWithData('post', 'put', 'patch'); - - /** - * @ngdoc property - * @name $http#defaults - * - * @description - * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of - * default headers, withCredentials as well as request and response transformations. - * - * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. - */ - $http.defaults = defaults; - - - return $http; - - - function createShortMethods(names) { - forEach(arguments, function(name) { - $http[name] = function(url, config) { - return $http(extend(config || {}, { - method: name, - url: url - })); - }; - }); - } - - - function createShortMethodsWithData(name) { - forEach(arguments, function(name) { - $http[name] = function(url, data, config) { - return $http(extend(config || {}, { - method: name, - url: url, - data: data - })); - }; - }); - } - - - /** - * Makes the request. - * - * !!! ACCESSES CLOSURE VARS: - * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests - */ - function sendReq(config, reqData) { - var deferred = $q.defer(), - promise = deferred.promise, - cache, - cachedResp, - reqHeaders = config.headers, - url = buildUrl(config.url, config.params); - - $http.pendingRequests.push(config); - promise.then(removePendingReq, removePendingReq); - - - if ((config.cache || defaults.cache) && config.cache !== false && - (config.method === 'GET' || config.method === 'JSONP')) { - cache = isObject(config.cache) ? config.cache - : isObject(defaults.cache) ? defaults.cache - : defaultCache; - } - - if (cache) { - cachedResp = cache.get(url); - if (isDefined(cachedResp)) { - if (isPromiseLike(cachedResp)) { - // cached request has already been sent, but there is no response yet - cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult); - } else { - // serving from cache - if (isArray(cachedResp)) { - resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]); - } else { - resolvePromise(cachedResp, 200, {}, 'OK'); - } - } - } else { - // put the promise for the non-transformed response into cache as a placeholder - cache.put(url, promise); - } - } - - - // if we won't have the response in cache, set the xsrf headers and - // send the request to the backend - if (isUndefined(cachedResp)) { - var xsrfValue = urlIsSameOrigin(config.url) - ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] - : undefined; - if (xsrfValue) { - reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; - } - - $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, - config.withCredentials, config.responseType); - } - - return promise; - - - /** - * Callback registered to $httpBackend(): - * - caches the response if desired - * - resolves the raw $http promise - * - calls $apply - */ - function done(status, response, headersString, statusText) { - if (cache) { - if (isSuccess(status)) { - cache.put(url, [status, response, parseHeaders(headersString), statusText]); - } else { - // remove promise from the cache - cache.remove(url); - } - } - - function resolveHttpPromise() { - resolvePromise(response, status, headersString, statusText); - } - - if (useApplyAsync) { - $rootScope.$applyAsync(resolveHttpPromise); - } else { - resolveHttpPromise(); - if (!$rootScope.$$phase) $rootScope.$apply(); - } - } - - - /** - * Resolves the raw $http promise. - */ - function resolvePromise(response, status, headers, statusText) { - // normalize internal statuses to 0 - status = Math.max(status, 0); - - (isSuccess(status) ? deferred.resolve : deferred.reject)({ - data: response, - status: status, - headers: headersGetter(headers), - config: config, - statusText: statusText - }); - } - - function resolvePromiseWithResult(result) { - resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText); - } - - function removePendingReq() { - var idx = $http.pendingRequests.indexOf(config); - if (idx !== -1) $http.pendingRequests.splice(idx, 1); - } - } - - - function buildUrl(url, params) { - if (!params) return url; - var parts = []; - forEachSorted(params, function(value, key) { - if (value === null || isUndefined(value)) return; - if (!isArray(value)) value = [value]; - - forEach(value, function(v) { - if (isObject(v)) { - if (isDate(v)) { - v = v.toISOString(); - } else { - v = toJson(v); - } - } - parts.push(encodeUriQuery(key) + '=' + - encodeUriQuery(v)); - }); - }); - if (parts.length > 0) { - url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&'); - } - return url; - } - }]; -} - -function createXhr() { - return new window.XMLHttpRequest(); -} - -/** - * @ngdoc service - * @name $httpBackend - * @requires $window - * @requires $document - * - * @description - * HTTP backend used by the {@link ng.$http service} that delegates to - * XMLHttpRequest object or JSONP and deals with browser incompatibilities. - * - * You should never need to use this service directly, instead use the higher-level abstractions: - * {@link ng.$http $http} or {@link ngResource.$resource $resource}. - * - * During testing this implementation is swapped with {@link ngMock.$httpBackend mock - * $httpBackend} which can be trained with responses. - */ -function $HttpBackendProvider() { - this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { - return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]); - }]; -} - -function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) { - // TODO(vojta): fix the signature - return function(method, url, post, callback, headers, timeout, withCredentials, responseType) { - $browser.$$incOutstandingRequestCount(); - url = url || $browser.url(); - - if (lowercase(method) == 'jsonp') { - var callbackId = '_' + (callbacks.counter++).toString(36); - callbacks[callbackId] = function(data) { - callbacks[callbackId].data = data; - callbacks[callbackId].called = true; - }; - - var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), - callbackId, function(status, text) { - completeRequest(callback, status, callbacks[callbackId].data, "", text); - callbacks[callbackId] = noop; - }); - } else { - - var xhr = createXhr(); - - xhr.open(method, url, true); - forEach(headers, function(value, key) { - if (isDefined(value)) { - xhr.setRequestHeader(key, value); - } - }); - - xhr.onload = function requestLoaded() { - var statusText = xhr.statusText || ''; - - // responseText is the old-school way of retrieving response (supported by IE8 & 9) - // response/responseType properties were introduced in XHR Level2 spec (supported by IE10) - var response = ('response' in xhr) ? xhr.response : xhr.responseText; - - // normalize IE9 bug (http://bugs.jquery.com/ticket/1450) - var status = xhr.status === 1223 ? 204 : xhr.status; - - // fix status code when it is 0 (0 status is undocumented). - // Occurs when accessing file resources or on Android 4.1 stock browser - // while retrieving files from application cache. - if (status === 0) { - status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0; - } - - completeRequest(callback, - status, - response, - xhr.getAllResponseHeaders(), - statusText); - }; - - var requestError = function() { - // The response is always empty - // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error - completeRequest(callback, -1, null, null, ''); - }; - - xhr.onerror = requestError; - xhr.onabort = requestError; - - if (withCredentials) { - xhr.withCredentials = true; - } - - if (responseType) { - try { - xhr.responseType = responseType; - } catch (e) { - // WebKit added support for the json responseType value on 09/03/2013 - // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are - // known to throw when setting the value "json" as the response type. Other older - // browsers implementing the responseType - // - // The json response type can be ignored if not supported, because JSON payloads are - // parsed on the client-side regardless. - if (responseType !== 'json') { - throw e; - } - } - } - - xhr.send(post || null); - } - - if (timeout > 0) { - var timeoutId = $browserDefer(timeoutRequest, timeout); - } else if (isPromiseLike(timeout)) { - timeout.then(timeoutRequest); - } - - - function timeoutRequest() { - jsonpDone && jsonpDone(); - xhr && xhr.abort(); - } - - function completeRequest(callback, status, response, headersString, statusText) { - // cancel timeout and subsequent timeout promise resolution - if (timeoutId !== undefined) { - $browserDefer.cancel(timeoutId); - } - jsonpDone = xhr = null; - - callback(status, response, headersString, statusText); - $browser.$$completeOutstandingRequest(noop); - } - }; - - function jsonpReq(url, callbackId, done) { - // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.: - // - fetches local scripts via XHR and evals them - // - adds and immediately removes script elements from the document - var script = rawDocument.createElement('script'), callback = null; - script.type = "text/javascript"; - script.src = url; - script.async = true; - - callback = function(event) { - removeEventListenerFn(script, "load", callback); - removeEventListenerFn(script, "error", callback); - rawDocument.body.removeChild(script); - script = null; - var status = -1; - var text = "unknown"; - - if (event) { - if (event.type === "load" && !callbacks[callbackId].called) { - event = { type: "error" }; - } - text = event.type; - status = event.type === "error" ? 404 : 200; - } - - if (done) { - done(status, text); - } - }; - - addEventListenerFn(script, "load", callback); - addEventListenerFn(script, "error", callback); - rawDocument.body.appendChild(script); - return callback; - } -} - -var $interpolateMinErr = minErr('$interpolate'); - -/** - * @ngdoc provider - * @name $interpolateProvider - * - * @description - * - * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. - * - * @example - - - -
    - //demo.label// -
    -
    - - it('should interpolate binding with custom symbols', function() { - expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.'); - }); - -
    - */ -function $InterpolateProvider() { - var startSymbol = '{{'; - var endSymbol = '}}'; - - /** - * @ngdoc method - * @name $interpolateProvider#startSymbol - * @description - * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. - * - * @param {string=} value new value to set the starting symbol to. - * @returns {string|self} Returns the symbol when used as getter and self if used as setter. - */ - this.startSymbol = function(value) { - if (value) { - startSymbol = value; - return this; - } else { - return startSymbol; - } - }; - - /** - * @ngdoc method - * @name $interpolateProvider#endSymbol - * @description - * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. - * - * @param {string=} value new value to set the ending symbol to. - * @returns {string|self} Returns the symbol when used as getter and self if used as setter. - */ - this.endSymbol = function(value) { - if (value) { - endSymbol = value; - return this; - } else { - return endSymbol; - } - }; - - - this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) { - var startSymbolLength = startSymbol.length, - endSymbolLength = endSymbol.length, - escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'), - escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g'); - - function escape(ch) { - return '\\\\\\' + ch; - } - - /** - * @ngdoc service - * @name $interpolate - * @kind function - * - * @requires $parse - * @requires $sce - * - * @description - * - * Compiles a string with markup into an interpolation function. This service is used by the - * HTML {@link ng.$compile $compile} service for data binding. See - * {@link ng.$interpolateProvider $interpolateProvider} for configuring the - * interpolation markup. - * - * - * ```js - * var $interpolate = ...; // injected - * var exp = $interpolate('Hello {{name | uppercase}}!'); - * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!'); - * ``` - * - * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is - * `true`, the interpolation function will return `undefined` unless all embedded expressions - * evaluate to a value other than `undefined`. - * - * ```js - * var $interpolate = ...; // injected - * var context = {greeting: 'Hello', name: undefined }; - * - * // default "forgiving" mode - * var exp = $interpolate('{{greeting}} {{name}}!'); - * expect(exp(context)).toEqual('Hello !'); - * - * // "allOrNothing" mode - * exp = $interpolate('{{greeting}} {{name}}!', false, null, true); - * expect(exp(context)).toBeUndefined(); - * context.name = 'Angular'; - * expect(exp(context)).toEqual('Hello Angular!'); - * ``` - * - * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior. - * - * ####Escaped Interpolation - * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers - * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash). - * It will be rendered as a regular start/end marker, and will not be interpreted as an expression - * or binding. - * - * This enables web-servers to prevent script injection attacks and defacing attacks, to some - * degree, while also enabling code examples to work without relying on the - * {@link ng.directive:ngNonBindable ngNonBindable} directive. - * - * **For security purposes, it is strongly encouraged that web servers escape user-supplied data, - * replacing angle brackets (<, >) with &lt; and &gt; respectively, and replacing all - * interpolation start/end markers with their escaped counterparts.** - * - * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered - * output when the $interpolate service processes the text. So, for HTML elements interpolated - * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter - * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such, - * this is typically useful only when user-data is used in rendering a template from the server, or - * when otherwise untrusted data is used by a directive. - * - * - * - *
    - *

    {{apptitle}}: \{\{ username = "defaced value"; \}\} - *

    - *

    {{username}} attempts to inject code which will deface the - * application, but fails to accomplish their task, because the server has correctly - * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash) - * characters.

    - *

    Instead, the result of the attempted script injection is visible, and can be removed - * from the database by an administrator.

    - *
    - *
    - *
    - * - * @param {string} text The text with markup to interpolate. - * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have - * embedded expression in order to return an interpolation function. Strings with no - * embedded expression will return null for the interpolation function. - * @param {string=} trustedContext when provided, the returned function passes the interpolated - * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult, - * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that - * provides Strict Contextual Escaping for details. - * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined - * unless all embedded expressions evaluate to a value other than `undefined`. - * @returns {function(context)} an interpolation function which is used to compute the - * interpolated string. The function has these parameters: - * - * - `context`: evaluation context for all expressions embedded in the interpolated text - */ - function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) { - allOrNothing = !!allOrNothing; - var startIndex, - endIndex, - index = 0, - expressions = [], - parseFns = [], - textLength = text.length, - exp, - concat = [], - expressionPositions = []; - - while (index < textLength) { - if (((startIndex = text.indexOf(startSymbol, index)) != -1) && - ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) { - if (index !== startIndex) { - concat.push(unescapeText(text.substring(index, startIndex))); - } - exp = text.substring(startIndex + startSymbolLength, endIndex); - expressions.push(exp); - parseFns.push($parse(exp, parseStringifyInterceptor)); - index = endIndex + endSymbolLength; - expressionPositions.push(concat.length); - concat.push(''); - } else { - // we did not find an interpolation, so we have to add the remainder to the separators array - if (index !== textLength) { - concat.push(unescapeText(text.substring(index))); - } - break; - } - } - - // Concatenating expressions makes it hard to reason about whether some combination of - // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a - // single expression be used for iframe[src], object[src], etc., we ensure that the value - // that's used is assigned or constructed by some JS code somewhere that is more testable or - // make it obvious that you bound the value to some user controlled value. This helps reduce - // the load when auditing for XSS issues. - if (trustedContext && concat.length > 1) { - throw $interpolateMinErr('noconcat', - "Error while interpolating: {0}\nStrict Contextual Escaping disallows " + - "interpolations that concatenate multiple expressions when a trusted value is " + - "required. See http://docs.angularjs.org/api/ng.$sce", text); - } - - if (!mustHaveExpression || expressions.length) { - var compute = function(values) { - for (var i = 0, ii = expressions.length; i < ii; i++) { - if (allOrNothing && isUndefined(values[i])) return; - concat[expressionPositions[i]] = values[i]; - } - return concat.join(''); - }; - - var getValue = function(value) { - return trustedContext ? - $sce.getTrusted(trustedContext, value) : - $sce.valueOf(value); - }; - - var stringify = function(value) { - if (value == null) { // null || undefined - return ''; - } - switch (typeof value) { - case 'string': - break; - case 'number': - value = '' + value; - break; - default: - value = toJson(value); - } - - return value; - }; - - return extend(function interpolationFn(context) { - var i = 0; - var ii = expressions.length; - var values = new Array(ii); - - try { - for (; i < ii; i++) { - values[i] = parseFns[i](context); - } - - return compute(values); - } catch (err) { - var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, - err.toString()); - $exceptionHandler(newErr); - } - - }, { - // all of these properties are undocumented for now - exp: text, //just for compatibility with regular watchers created via $watch - expressions: expressions, - $$watchDelegate: function(scope, listener, objectEquality) { - var lastValue; - return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) { - var currValue = compute(values); - if (isFunction(listener)) { - listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope); - } - lastValue = currValue; - }, objectEquality); - } - }); - } - - function unescapeText(text) { - return text.replace(escapedStartRegexp, startSymbol). - replace(escapedEndRegexp, endSymbol); - } - - function parseStringifyInterceptor(value) { - try { - value = getValue(value); - return allOrNothing && !isDefined(value) ? value : stringify(value); - } catch (err) { - var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text, - err.toString()); - $exceptionHandler(newErr); - } - } - } - - - /** - * @ngdoc method - * @name $interpolate#startSymbol - * @description - * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`. - * - * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change - * the symbol. - * - * @returns {string} start symbol. - */ - $interpolate.startSymbol = function() { - return startSymbol; - }; - - - /** - * @ngdoc method - * @name $interpolate#endSymbol - * @description - * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. - * - * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change - * the symbol. - * - * @returns {string} end symbol. - */ - $interpolate.endSymbol = function() { - return endSymbol; - }; - - return $interpolate; - }]; -} - -function $IntervalProvider() { - this.$get = ['$rootScope', '$window', '$q', '$$q', - function($rootScope, $window, $q, $$q) { - var intervals = {}; - - - /** - * @ngdoc service - * @name $interval - * - * @description - * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay` - * milliseconds. - * - * The return value of registering an interval function is a promise. This promise will be - * notified upon each tick of the interval, and will be resolved after `count` iterations, or - * run indefinitely if `count` is not defined. The value of the notification will be the - * number of iterations that have run. - * To cancel an interval, call `$interval.cancel(promise)`. - * - * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to - * move forward by `millis` milliseconds and trigger any functions scheduled to run in that - * time. - * - *
    - * **Note**: Intervals created by this service must be explicitly destroyed when you are finished - * with them. In particular they are not automatically destroyed when a controller's scope or a - * directive's element are destroyed. - * You should take this into consideration and make sure to always cancel the interval at the - * appropriate moment. See the example below for more details on how and when to do this. - *
    - * - * @param {function()} fn A function that should be called repeatedly. - * @param {number} delay Number of milliseconds between each function call. - * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat - * indefinitely. - * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise - * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. - * @returns {promise} A promise which will be notified on each iteration. - * - * @example - * - * - * - * - *
    - *
    - * Date format:
    - * Current time is: - *
    - * Blood 1 : {{blood_1}} - * Blood 2 : {{blood_2}} - * - * - * - *
    - *
    - * - *
    - *
    - */ - function interval(fn, delay, count, invokeApply) { - var setInterval = $window.setInterval, - clearInterval = $window.clearInterval, - iteration = 0, - skipApply = (isDefined(invokeApply) && !invokeApply), - deferred = (skipApply ? $$q : $q).defer(), - promise = deferred.promise; - - count = isDefined(count) ? count : 0; - - promise.then(null, null, fn); - - promise.$$intervalId = setInterval(function tick() { - deferred.notify(iteration++); - - if (count > 0 && iteration >= count) { - deferred.resolve(iteration); - clearInterval(promise.$$intervalId); - delete intervals[promise.$$intervalId]; - } - - if (!skipApply) $rootScope.$apply(); - - }, delay); - - intervals[promise.$$intervalId] = deferred; - - return promise; - } - - - /** - * @ngdoc method - * @name $interval#cancel - * - * @description - * Cancels a task associated with the `promise`. - * - * @param {promise} promise returned by the `$interval` function. - * @returns {boolean} Returns `true` if the task was successfully canceled. - */ - interval.cancel = function(promise) { - if (promise && promise.$$intervalId in intervals) { - intervals[promise.$$intervalId].reject('canceled'); - $window.clearInterval(promise.$$intervalId); - delete intervals[promise.$$intervalId]; - return true; - } - return false; - }; - - return interval; - }]; -} - -/** - * @ngdoc service - * @name $locale - * - * @description - * $locale service provides localization rules for various Angular components. As of right now the - * only public api is: - * - * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) - */ -function $LocaleProvider() { - this.$get = function() { - return { - id: 'en-us', - - NUMBER_FORMATS: { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PATTERNS: [ - { // Decimal Pattern - minInt: 1, - minFrac: 0, - maxFrac: 3, - posPre: '', - posSuf: '', - negPre: '-', - negSuf: '', - gSize: 3, - lgSize: 3 - },{ //Currency Pattern - minInt: 1, - minFrac: 2, - maxFrac: 2, - posPre: '\u00A4', - posSuf: '', - negPre: '(\u00A4', - negSuf: ')', - gSize: 3, - lgSize: 3 - } - ], - CURRENCY_SYM: '$' - }, - - DATETIME_FORMATS: { - MONTH: - 'January,February,March,April,May,June,July,August,September,October,November,December' - .split(','), - SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), - DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), - SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), - AMPMS: ['AM','PM'], - medium: 'MMM d, y h:mm:ss a', - 'short': 'M/d/yy h:mm a', - fullDate: 'EEEE, MMMM d, y', - longDate: 'MMMM d, y', - mediumDate: 'MMM d, y', - shortDate: 'M/d/yy', - mediumTime: 'h:mm:ss a', - shortTime: 'h:mm a' - }, - - pluralCat: function(num) { - if (num === 1) { - return 'one'; - } - return 'other'; - } - }; - }; -} - -var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/, - DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21}; -var $locationMinErr = minErr('$location'); - - -/** - * Encode path using encodeUriSegment, ignoring forward slashes - * - * @param {string} path Path to encode - * @returns {string} - */ -function encodePath(path) { - var segments = path.split('/'), - i = segments.length; - - while (i--) { - segments[i] = encodeUriSegment(segments[i]); - } - - return segments.join('/'); -} - -function parseAbsoluteUrl(absoluteUrl, locationObj) { - var parsedUrl = urlResolve(absoluteUrl); - - locationObj.$$protocol = parsedUrl.protocol; - locationObj.$$host = parsedUrl.hostname; - locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null; -} - - -function parseAppUrl(relativeUrl, locationObj) { - var prefixed = (relativeUrl.charAt(0) !== '/'); - if (prefixed) { - relativeUrl = '/' + relativeUrl; - } - var match = urlResolve(relativeUrl); - locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ? - match.pathname.substring(1) : match.pathname); - locationObj.$$search = parseKeyValue(match.search); - locationObj.$$hash = decodeURIComponent(match.hash); - - // make sure path starts with '/'; - if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') { - locationObj.$$path = '/' + locationObj.$$path; - } -} - - -/** - * - * @param {string} begin - * @param {string} whole - * @returns {string} returns text from whole after begin or undefined if it does not begin with - * expected string. - */ -function beginsWith(begin, whole) { - if (whole.indexOf(begin) === 0) { - return whole.substr(begin.length); - } -} - - -function stripHash(url) { - var index = url.indexOf('#'); - return index == -1 ? url : url.substr(0, index); -} - -function trimEmptyHash(url) { - return url.replace(/(#.+)|#$/, '$1'); -} - - -function stripFile(url) { - return url.substr(0, stripHash(url).lastIndexOf('/') + 1); -} - -/* return the server only (scheme://host:port) */ -function serverBase(url) { - return url.substring(0, url.indexOf('/', url.indexOf('//') + 2)); -} - - -/** - * LocationHtml5Url represents an url - * This object is exposed as $location service when HTML5 mode is enabled and supported - * - * @constructor - * @param {string} appBase application base URL - * @param {string} basePrefix url path prefix - */ -function LocationHtml5Url(appBase, basePrefix) { - this.$$html5 = true; - basePrefix = basePrefix || ''; - var appBaseNoFile = stripFile(appBase); - parseAbsoluteUrl(appBase, this); - - - /** - * Parse given html5 (regular) url string into properties - * @param {string} url HTML5 url - * @private - */ - this.$$parse = function(url) { - var pathUrl = beginsWith(appBaseNoFile, url); - if (!isString(pathUrl)) { - throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url, - appBaseNoFile); - } - - parseAppUrl(pathUrl, this); - - if (!this.$$path) { - this.$$path = '/'; - } - - this.$$compose(); - }; - - /** - * Compose url and update `absUrl` property - * @private - */ - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/' - }; - - this.$$parseLinkUrl = function(url, relHref) { - if (relHref && relHref[0] === '#') { - // special case for links to hash fragments: - // keep the old url and only replace the hash fragment - this.hash(relHref.slice(1)); - return true; - } - var appUrl, prevAppUrl; - var rewrittenUrl; - - if ((appUrl = beginsWith(appBase, url)) !== undefined) { - prevAppUrl = appUrl; - if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) { - rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl); - } else { - rewrittenUrl = appBase + prevAppUrl; - } - } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) { - rewrittenUrl = appBaseNoFile + appUrl; - } else if (appBaseNoFile == url + '/') { - rewrittenUrl = appBaseNoFile; - } - if (rewrittenUrl) { - this.$$parse(rewrittenUrl); - } - return !!rewrittenUrl; - }; -} - - -/** - * LocationHashbangUrl represents url - * This object is exposed as $location service when developer doesn't opt into html5 mode. - * It also serves as the base class for html5 mode fallback on legacy browsers. - * - * @constructor - * @param {string} appBase application base URL - * @param {string} hashPrefix hashbang prefix - */ -function LocationHashbangUrl(appBase, hashPrefix) { - var appBaseNoFile = stripFile(appBase); - - parseAbsoluteUrl(appBase, this); - - - /** - * Parse given hashbang url into properties - * @param {string} url Hashbang url - * @private - */ - this.$$parse = function(url) { - var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url); - var withoutHashUrl; - - if (withoutBaseUrl.charAt(0) === '#') { - - // The rest of the url starts with a hash so we have - // got either a hashbang path or a plain hash fragment - withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl); - if (isUndefined(withoutHashUrl)) { - // There was no hashbang prefix so we just have a hash fragment - withoutHashUrl = withoutBaseUrl; - } - - } else { - // There was no hashbang path nor hash fragment: - // If we are in HTML5 mode we use what is left as the path; - // Otherwise we ignore what is left - withoutHashUrl = this.$$html5 ? withoutBaseUrl : ''; - } - - parseAppUrl(withoutHashUrl, this); - - this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase); - - this.$$compose(); - - /* - * In Windows, on an anchor node on documents loaded from - * the filesystem, the browser will return a pathname - * prefixed with the drive name ('/C:/path') when a - * pathname without a drive is set: - * * a.setAttribute('href', '/foo') - * * a.pathname === '/C:/foo' //true - * - * Inside of Angular, we're always using pathnames that - * do not include drive names for routing. - */ - function removeWindowsDriveName(path, url, base) { - /* - Matches paths for file protocol on windows, - such as /C:/foo/bar, and captures only /foo/bar. - */ - var windowsFilePathExp = /^\/[A-Z]:(\/.*)/; - - var firstPathSegmentMatch; - - //Get the relative path from the input URL. - if (url.indexOf(base) === 0) { - url = url.replace(base, ''); - } - - // The input URL intentionally contains a first path segment that ends with a colon. - if (windowsFilePathExp.exec(url)) { - return path; - } - - firstPathSegmentMatch = windowsFilePathExp.exec(path); - return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path; - } - }; - - /** - * Compose hashbang url and update `absUrl` property - * @private - */ - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : ''); - }; - - this.$$parseLinkUrl = function(url, relHref) { - if (stripHash(appBase) == stripHash(url)) { - this.$$parse(url); - return true; - } - return false; - }; -} - - -/** - * LocationHashbangUrl represents url - * This object is exposed as $location service when html5 history api is enabled but the browser - * does not support it. - * - * @constructor - * @param {string} appBase application base URL - * @param {string} hashPrefix hashbang prefix - */ -function LocationHashbangInHtml5Url(appBase, hashPrefix) { - this.$$html5 = true; - LocationHashbangUrl.apply(this, arguments); - - var appBaseNoFile = stripFile(appBase); - - this.$$parseLinkUrl = function(url, relHref) { - if (relHref && relHref[0] === '#') { - // special case for links to hash fragments: - // keep the old url and only replace the hash fragment - this.hash(relHref.slice(1)); - return true; - } - - var rewrittenUrl; - var appUrl; - - if (appBase == stripHash(url)) { - rewrittenUrl = url; - } else if ((appUrl = beginsWith(appBaseNoFile, url))) { - rewrittenUrl = appBase + hashPrefix + appUrl; - } else if (appBaseNoFile === url + '/') { - rewrittenUrl = appBaseNoFile; - } - if (rewrittenUrl) { - this.$$parse(rewrittenUrl); - } - return !!rewrittenUrl; - }; - - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#' - this.$$absUrl = appBase + hashPrefix + this.$$url; - }; - -} - - -var locationPrototype = { - - /** - * Are we in html5 mode? - * @private - */ - $$html5: false, - - /** - * Has any change been replacing? - * @private - */ - $$replace: false, - - /** - * @ngdoc method - * @name $location#absUrl - * - * @description - * This method is getter only. - * - * Return full url representation with all segments encoded according to rules specified in - * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var absUrl = $location.absUrl(); - * // => "http://example.com/#/some/path?foo=bar&baz=xoxo" - * ``` - * - * @return {string} full url - */ - absUrl: locationGetter('$$absUrl'), - - /** - * @ngdoc method - * @name $location#url - * - * @description - * This method is getter / setter. - * - * Return url (e.g. `/path?a=b#hash`) when called without any parameter. - * - * Change path, search and hash, when called with parameter and return `$location`. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var url = $location.url(); - * // => "/some/path?foo=bar&baz=xoxo" - * ``` - * - * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) - * @return {string} url - */ - url: function(url) { - if (isUndefined(url)) - return this.$$url; - - var match = PATH_MATCH.exec(url); - if (match[1] || url === '') this.path(decodeURIComponent(match[1])); - if (match[2] || match[1] || url === '') this.search(match[3] || ''); - this.hash(match[5] || ''); - - return this; - }, - - /** - * @ngdoc method - * @name $location#protocol - * - * @description - * This method is getter only. - * - * Return protocol of current url. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var protocol = $location.protocol(); - * // => "http" - * ``` - * - * @return {string} protocol of current url - */ - protocol: locationGetter('$$protocol'), - - /** - * @ngdoc method - * @name $location#host - * - * @description - * This method is getter only. - * - * Return host of current url. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var host = $location.host(); - * // => "example.com" - * ``` - * - * @return {string} host of current url. - */ - host: locationGetter('$$host'), - - /** - * @ngdoc method - * @name $location#port - * - * @description - * This method is getter only. - * - * Return port of current url. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var port = $location.port(); - * // => 80 - * ``` - * - * @return {Number} port - */ - port: locationGetter('$$port'), - - /** - * @ngdoc method - * @name $location#path - * - * @description - * This method is getter / setter. - * - * Return path of current url when called without any parameter. - * - * Change path when called with parameter and return `$location`. - * - * Note: Path should always begin with forward slash (/), this method will add the forward slash - * if it is missing. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var path = $location.path(); - * // => "/some/path" - * ``` - * - * @param {(string|number)=} path New path - * @return {string} path - */ - path: locationGetterSetter('$$path', function(path) { - path = path !== null ? path.toString() : ''; - return path.charAt(0) == '/' ? path : '/' + path; - }), - - /** - * @ngdoc method - * @name $location#search - * - * @description - * This method is getter / setter. - * - * Return search part (as object) of current url when called without any parameter. - * - * Change search part when called with parameter and return `$location`. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo - * var searchObject = $location.search(); - * // => {foo: 'bar', baz: 'xoxo'} - * - * // set foo to 'yipee' - * $location.search('foo', 'yipee'); - * // $location.search() => {foo: 'yipee', baz: 'xoxo'} - * ``` - * - * @param {string|Object.|Object.>} search New search params - string or - * hash object. - * - * When called with a single argument the method acts as a setter, setting the `search` component - * of `$location` to the specified value. - * - * If the argument is a hash object containing an array of values, these values will be encoded - * as duplicate search parameters in the url. - * - * @param {(string|Number|Array|boolean)=} paramValue If `search` is a string or number, then `paramValue` - * will override only a single search property. - * - * If `paramValue` is an array, it will override the property of the `search` component of - * `$location` specified via the first argument. - * - * If `paramValue` is `null`, the property specified via the first argument will be deleted. - * - * If `paramValue` is `true`, the property specified via the first argument will be added with no - * value nor trailing equal sign. - * - * @return {Object} If called with no arguments returns the parsed `search` object. If called with - * one or more arguments returns `$location` object itself. - */ - search: function(search, paramValue) { - switch (arguments.length) { - case 0: - return this.$$search; - case 1: - if (isString(search) || isNumber(search)) { - search = search.toString(); - this.$$search = parseKeyValue(search); - } else if (isObject(search)) { - search = copy(search, {}); - // remove object undefined or null properties - forEach(search, function(value, key) { - if (value == null) delete search[key]; - }); - - this.$$search = search; - } else { - throw $locationMinErr('isrcharg', - 'The first argument of the `$location#search()` call must be a string or an object.'); - } - break; - default: - if (isUndefined(paramValue) || paramValue === null) { - delete this.$$search[search]; - } else { - this.$$search[search] = paramValue; - } - } - - this.$$compose(); - return this; - }, - - /** - * @ngdoc method - * @name $location#hash - * - * @description - * This method is getter / setter. - * - * Return hash fragment when called without any parameter. - * - * Change hash fragment when called with parameter and return `$location`. - * - * - * ```js - * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue - * var hash = $location.hash(); - * // => "hashValue" - * ``` - * - * @param {(string|number)=} hash New hash fragment - * @return {string} hash - */ - hash: locationGetterSetter('$$hash', function(hash) { - return hash !== null ? hash.toString() : ''; - }), - - /** - * @ngdoc method - * @name $location#replace - * - * @description - * If called, all changes to $location during current `$digest` will be replacing current history - * record, instead of adding new one. - */ - replace: function() { - this.$$replace = true; - return this; - } -}; - -forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) { - Location.prototype = Object.create(locationPrototype); - - /** - * @ngdoc method - * @name $location#state - * - * @description - * This method is getter / setter. - * - * Return the history state object when called without any parameter. - * - * Change the history state object when called with one parameter and return `$location`. - * The state object is later passed to `pushState` or `replaceState`. - * - * NOTE: This method is supported only in HTML5 mode and only in browsers supporting - * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support - * older browsers (like IE9 or Android < 4.0), don't use this method. - * - * @param {object=} state State object for pushState or replaceState - * @return {object} state - */ - Location.prototype.state = function(state) { - if (!arguments.length) - return this.$$state; - - if (Location !== LocationHtml5Url || !this.$$html5) { - throw $locationMinErr('nostate', 'History API state support is available only ' + - 'in HTML5 mode and only in browsers supporting HTML5 History API'); - } - // The user might modify `stateObject` after invoking `$location.state(stateObject)` - // but we're changing the $$state reference to $browser.state() during the $digest - // so the modification window is narrow. - this.$$state = isUndefined(state) ? null : state; - - return this; - }; -}); - - -function locationGetter(property) { - return function() { - return this[property]; - }; -} - - -function locationGetterSetter(property, preprocess) { - return function(value) { - if (isUndefined(value)) - return this[property]; - - this[property] = preprocess(value); - this.$$compose(); - - return this; - }; -} - - -/** - * @ngdoc service - * @name $location - * - * @requires $rootElement - * - * @description - * The $location service parses the URL in the browser address bar (based on the - * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL - * available to your application. Changes to the URL in the address bar are reflected into - * $location service and changes to $location are reflected into the browser address bar. - * - * **The $location service:** - * - * - Exposes the current URL in the browser address bar, so you can - * - Watch and observe the URL. - * - Change the URL. - * - Synchronizes the URL with the browser when the user - * - Changes the address bar. - * - Clicks the back or forward button (or clicks a History link). - * - Clicks on a link. - * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). - * - * For more information see {@link guide/$location Developer Guide: Using $location} - */ - -/** - * @ngdoc provider - * @name $locationProvider - * @description - * Use the `$locationProvider` to configure how the application deep linking paths are stored. - */ -function $LocationProvider() { - var hashPrefix = '', - html5Mode = { - enabled: false, - requireBase: true, - rewriteLinks: true - }; - - /** - * @ngdoc method - * @name $locationProvider#hashPrefix - * @description - * @param {string=} prefix Prefix for hash part (containing path and search) - * @returns {*} current value if used as getter or itself (chaining) if used as setter - */ - this.hashPrefix = function(prefix) { - if (isDefined(prefix)) { - hashPrefix = prefix; - return this; - } else { - return hashPrefix; - } - }; - - /** - * @ngdoc method - * @name $locationProvider#html5Mode - * @description - * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value. - * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported - * properties: - * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to - * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not - * support `pushState`. - * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies - * whether or not a tag is required to be present. If `enabled` and `requireBase` are - * true, and a base tag is not present, an error will be thrown when `$location` is injected. - * See the {@link guide/$location $location guide for more information} - * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled, - * enables/disables url rewriting for relative links. - * - * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter - */ - this.html5Mode = function(mode) { - if (isBoolean(mode)) { - html5Mode.enabled = mode; - return this; - } else if (isObject(mode)) { - - if (isBoolean(mode.enabled)) { - html5Mode.enabled = mode.enabled; - } - - if (isBoolean(mode.requireBase)) { - html5Mode.requireBase = mode.requireBase; - } - - if (isBoolean(mode.rewriteLinks)) { - html5Mode.rewriteLinks = mode.rewriteLinks; - } - - return this; - } else { - return html5Mode; - } - }; - - /** - * @ngdoc event - * @name $location#$locationChangeStart - * @eventType broadcast on root scope - * @description - * Broadcasted before a URL will change. - * - * This change can be prevented by calling - * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more - * details about event object. Upon successful change - * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired. - * - * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when - * the browser supports the HTML5 History API. - * - * @param {Object} angularEvent Synthetic event object. - * @param {string} newUrl New URL - * @param {string=} oldUrl URL that was before it was changed. - * @param {string=} newState New history state object - * @param {string=} oldState History state object that was before it was changed. - */ - - /** - * @ngdoc event - * @name $location#$locationChangeSuccess - * @eventType broadcast on root scope - * @description - * Broadcasted after a URL was changed. - * - * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when - * the browser supports the HTML5 History API. - * - * @param {Object} angularEvent Synthetic event object. - * @param {string} newUrl New URL - * @param {string=} oldUrl URL that was before it was changed. - * @param {string=} newState New history state object - * @param {string=} oldState History state object that was before it was changed. - */ - - this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window', - function($rootScope, $browser, $sniffer, $rootElement, $window) { - var $location, - LocationMode, - baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to '' - initialUrl = $browser.url(), - appBase; - - if (html5Mode.enabled) { - if (!baseHref && html5Mode.requireBase) { - throw $locationMinErr('nobase', - "$location in HTML5 mode requires a tag to be present!"); - } - appBase = serverBase(initialUrl) + (baseHref || '/'); - LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url; - } else { - appBase = stripHash(initialUrl); - LocationMode = LocationHashbangUrl; - } - $location = new LocationMode(appBase, '#' + hashPrefix); - $location.$$parseLinkUrl(initialUrl, initialUrl); - - $location.$$state = $browser.state(); - - var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i; - - function setBrowserUrlWithFallback(url, replace, state) { - var oldUrl = $location.url(); - var oldState = $location.$$state; - try { - $browser.url(url, replace, state); - - // Make sure $location.state() returns referentially identical (not just deeply equal) - // state object; this makes possible quick checking if the state changed in the digest - // loop. Checking deep equality would be too expensive. - $location.$$state = $browser.state(); - } catch (e) { - // Restore old values if pushState fails - $location.url(oldUrl); - $location.$$state = oldState; - - throw e; - } - } - - $rootElement.on('click', function(event) { - // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) - // currently we open nice url link and redirect then - - if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return; - - var elm = jqLite(event.target); - - // traverse the DOM up to find first A tag - while (nodeName_(elm[0]) !== 'a') { - // ignore rewriting if no A tag (reached root element, or no parent - removed from document) - if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; - } - - var absHref = elm.prop('href'); - // get the actual href attribute - see - // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx - var relHref = elm.attr('href') || elm.attr('xlink:href'); - - if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') { - // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during - // an animation. - absHref = urlResolve(absHref.animVal).href; - } - - // Ignore when url is started with javascript: or mailto: - if (IGNORE_URI_REGEXP.test(absHref)) return; - - if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) { - if ($location.$$parseLinkUrl(absHref, relHref)) { - // We do a preventDefault for all urls that are part of the angular application, - // in html5mode and also without, so that we are able to abort navigation without - // getting double entries in the location history. - event.preventDefault(); - // update location manually - if ($location.absUrl() != $browser.url()) { - $rootScope.$apply(); - // hack to work around FF6 bug 684208 when scenario runner clicks on links - $window.angular['ff-684208-preventDefault'] = true; - } - } - } - }); - - - // rewrite hashbang url <> html5 url - if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) { - $browser.url($location.absUrl(), true); - } - - var initializing = true; - - // update $location when $browser url changes - $browser.onUrlChange(function(newUrl, newState) { - $rootScope.$evalAsync(function() { - var oldUrl = $location.absUrl(); - var oldState = $location.$$state; - var defaultPrevented; - - $location.$$parse(newUrl); - $location.$$state = newState; - - defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, - newState, oldState).defaultPrevented; - - // if the location was changed by a `$locationChangeStart` handler then stop - // processing this location change - if ($location.absUrl() !== newUrl) return; - - if (defaultPrevented) { - $location.$$parse(oldUrl); - $location.$$state = oldState; - setBrowserUrlWithFallback(oldUrl, false, oldState); - } else { - initializing = false; - afterLocationChange(oldUrl, oldState); - } - }); - if (!$rootScope.$$phase) $rootScope.$digest(); - }); - - // update browser - $rootScope.$watch(function $locationWatch() { - var oldUrl = trimEmptyHash($browser.url()); - var newUrl = trimEmptyHash($location.absUrl()); - var oldState = $browser.state(); - var currentReplace = $location.$$replace; - var urlOrStateChanged = oldUrl !== newUrl || - ($location.$$html5 && $sniffer.history && oldState !== $location.$$state); - - if (initializing || urlOrStateChanged) { - initializing = false; - - $rootScope.$evalAsync(function() { - var newUrl = $location.absUrl(); - var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl, - $location.$$state, oldState).defaultPrevented; - - // if the location was changed by a `$locationChangeStart` handler then stop - // processing this location change - if ($location.absUrl() !== newUrl) return; - - if (defaultPrevented) { - $location.$$parse(oldUrl); - $location.$$state = oldState; - } else { - if (urlOrStateChanged) { - setBrowserUrlWithFallback(newUrl, currentReplace, - oldState === $location.$$state ? null : $location.$$state); - } - afterLocationChange(oldUrl, oldState); - } - }); - } - - $location.$$replace = false; - - // we don't need to return anything because $evalAsync will make the digest loop dirty when - // there is a change - }); - - return $location; - - function afterLocationChange(oldUrl, oldState) { - $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl, - $location.$$state, oldState); - } -}]; -} - -/** - * @ngdoc service - * @name $log - * @requires $window - * - * @description - * Simple service for logging. Default implementation safely writes the message - * into the browser's console (if present). - * - * The main purpose of this service is to simplify debugging and troubleshooting. - * - * The default is to log `debug` messages. You can use - * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this. - * - * @example - - - angular.module('logExample', []) - .controller('LogController', ['$scope', '$log', function($scope, $log) { - $scope.$log = $log; - $scope.message = 'Hello World!'; - }]); - - -
    -

    Reload this page with open console, enter text and hit the log button...

    - Message: - - - - - -
    -
    -
    - */ - -/** - * @ngdoc provider - * @name $logProvider - * @description - * Use the `$logProvider` to configure how the application logs messages - */ -function $LogProvider() { - var debug = true, - self = this; - - /** - * @ngdoc method - * @name $logProvider#debugEnabled - * @description - * @param {boolean=} flag enable or disable debug level messages - * @returns {*} current value if used as getter or itself (chaining) if used as setter - */ - this.debugEnabled = function(flag) { - if (isDefined(flag)) { - debug = flag; - return this; - } else { - return debug; - } - }; - - this.$get = ['$window', function($window) { - return { - /** - * @ngdoc method - * @name $log#log - * - * @description - * Write a log message - */ - log: consoleLog('log'), - - /** - * @ngdoc method - * @name $log#info - * - * @description - * Write an information message - */ - info: consoleLog('info'), - - /** - * @ngdoc method - * @name $log#warn - * - * @description - * Write a warning message - */ - warn: consoleLog('warn'), - - /** - * @ngdoc method - * @name $log#error - * - * @description - * Write an error message - */ - error: consoleLog('error'), - - /** - * @ngdoc method - * @name $log#debug - * - * @description - * Write a debug message - */ - debug: (function() { - var fn = consoleLog('debug'); - - return function() { - if (debug) { - fn.apply(self, arguments); - } - }; - }()) - }; - - function formatError(arg) { - if (arg instanceof Error) { - if (arg.stack) { - arg = (arg.message && arg.stack.indexOf(arg.message) === -1) - ? 'Error: ' + arg.message + '\n' + arg.stack - : arg.stack; - } else if (arg.sourceURL) { - arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; - } - } - return arg; - } - - function consoleLog(type) { - var console = $window.console || {}, - logFn = console[type] || console.log || noop, - hasApply = false; - - // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. - // The reason behind this is that console.log has type "object" in IE8... - try { - hasApply = !!logFn.apply; - } catch (e) {} - - if (hasApply) { - return function() { - var args = []; - forEach(arguments, function(arg) { - args.push(formatError(arg)); - }); - return logFn.apply(console, args); - }; - } - - // we are IE which either doesn't have window.console => this is noop and we do nothing, - // or we are IE where console.log doesn't have apply so we log at least first 2 args - return function(arg1, arg2) { - logFn(arg1, arg2 == null ? '' : arg2); - }; - } - }]; -} - -var $parseMinErr = minErr('$parse'); - -// Sandboxing Angular Expressions -// ------------------------------ -// Angular expressions are generally considered safe because these expressions only have direct -// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by -// obtaining a reference to native JS functions such as the Function constructor. -// -// As an example, consider the following Angular expression: -// -// {}.toString.constructor('alert("evil JS code")') -// -// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits -// against the expression language, but not to prevent exploits that were enabled by exposing -// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good -// practice and therefore we are not even trying to protect against interaction with an object -// explicitly exposed in this way. -// -// In general, it is not possible to access a Window object from an angular expression unless a -// window or some DOM object that has a reference to window is published onto a Scope. -// Similarly we prevent invocations of function known to be dangerous, as well as assignments to -// native objects. -// -// See https://docs.angularjs.org/guide/security - - -function ensureSafeMemberName(name, fullExpression) { - if (name === "__defineGetter__" || name === "__defineSetter__" - || name === "__lookupGetter__" || name === "__lookupSetter__" - || name === "__proto__") { - throw $parseMinErr('isecfld', - 'Attempting to access a disallowed field in Angular expressions! ' - + 'Expression: {0}', fullExpression); - } - return name; -} - -function ensureSafeObject(obj, fullExpression) { - // nifty check if obj is Function that is fast and works across iframes and other contexts - if (obj) { - if (obj.constructor === obj) { - throw $parseMinErr('isecfn', - 'Referencing Function in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// isWindow(obj) - obj.window === obj) { - throw $parseMinErr('isecwindow', - 'Referencing the Window in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// isElement(obj) - obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) { - throw $parseMinErr('isecdom', - 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (// block Object so that we can't get hold of dangerous Object.* methods - obj === Object) { - throw $parseMinErr('isecobj', - 'Referencing Object in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } - } - return obj; -} - -var CALL = Function.prototype.call; -var APPLY = Function.prototype.apply; -var BIND = Function.prototype.bind; - -function ensureSafeFunction(obj, fullExpression) { - if (obj) { - if (obj.constructor === obj) { - throw $parseMinErr('isecfn', - 'Referencing Function in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } else if (obj === CALL || obj === APPLY || obj === BIND) { - throw $parseMinErr('isecff', - 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}', - fullExpression); - } - } -} - -//Keyword constants -var CONSTANTS = createMap(); -forEach({ - 'null': function() { return null; }, - 'true': function() { return true; }, - 'false': function() { return false; }, - 'undefined': function() {} -}, function(constantGetter, name) { - constantGetter.constant = constantGetter.literal = constantGetter.sharedGetter = true; - CONSTANTS[name] = constantGetter; -}); - -//Not quite a constant, but can be lex/parsed the same -CONSTANTS['this'] = function(self) { return self; }; -CONSTANTS['this'].sharedGetter = true; - - -//Operators - will be wrapped by binaryFn/unaryFn/assignment/filter -var OPERATORS = extend(createMap(), { - '+':function(self, locals, a, b) { - a=a(self, locals); b=b(self, locals); - if (isDefined(a)) { - if (isDefined(b)) { - return a + b; - } - return a; - } - return isDefined(b) ? b : undefined;}, - '-':function(self, locals, a, b) { - a=a(self, locals); b=b(self, locals); - return (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0); - }, - '*':function(self, locals, a, b) {return a(self, locals) * b(self, locals);}, - '/':function(self, locals, a, b) {return a(self, locals) / b(self, locals);}, - '%':function(self, locals, a, b) {return a(self, locals) % b(self, locals);}, - '===':function(self, locals, a, b) {return a(self, locals) === b(self, locals);}, - '!==':function(self, locals, a, b) {return a(self, locals) !== b(self, locals);}, - '==':function(self, locals, a, b) {return a(self, locals) == b(self, locals);}, - '!=':function(self, locals, a, b) {return a(self, locals) != b(self, locals);}, - '<':function(self, locals, a, b) {return a(self, locals) < b(self, locals);}, - '>':function(self, locals, a, b) {return a(self, locals) > b(self, locals);}, - '<=':function(self, locals, a, b) {return a(self, locals) <= b(self, locals);}, - '>=':function(self, locals, a, b) {return a(self, locals) >= b(self, locals);}, - '&&':function(self, locals, a, b) {return a(self, locals) && b(self, locals);}, - '||':function(self, locals, a, b) {return a(self, locals) || b(self, locals);}, - '!':function(self, locals, a) {return !a(self, locals);}, - - //Tokenized as operators but parsed as assignment/filters - '=':true, - '|':true -}); -var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; - - -///////////////////////////////////////// - - -/** - * @constructor - */ -var Lexer = function(options) { - this.options = options; -}; - -Lexer.prototype = { - constructor: Lexer, - - lex: function(text) { - this.text = text; - this.index = 0; - this.tokens = []; - - while (this.index < this.text.length) { - var ch = this.text.charAt(this.index); - if (ch === '"' || ch === "'") { - this.readString(ch); - } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) { - this.readNumber(); - } else if (this.isIdent(ch)) { - this.readIdent(); - } else if (this.is(ch, '(){}[].,;:?')) { - this.tokens.push({index: this.index, text: ch}); - this.index++; - } else if (this.isWhitespace(ch)) { - this.index++; - } else { - var ch2 = ch + this.peek(); - var ch3 = ch2 + this.peek(2); - var op1 = OPERATORS[ch]; - var op2 = OPERATORS[ch2]; - var op3 = OPERATORS[ch3]; - if (op1 || op2 || op3) { - var token = op3 ? ch3 : (op2 ? ch2 : ch); - this.tokens.push({index: this.index, text: token, operator: true}); - this.index += token.length; - } else { - this.throwError('Unexpected next character ', this.index, this.index + 1); - } - } - } - return this.tokens; - }, - - is: function(ch, chars) { - return chars.indexOf(ch) !== -1; - }, - - peek: function(i) { - var num = i || 1; - return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false; - }, - - isNumber: function(ch) { - return ('0' <= ch && ch <= '9') && typeof ch === "string"; - }, - - isWhitespace: function(ch) { - // IE treats non-breaking space as \u00A0 - return (ch === ' ' || ch === '\r' || ch === '\t' || - ch === '\n' || ch === '\v' || ch === '\u00A0'); - }, - - isIdent: function(ch) { - return ('a' <= ch && ch <= 'z' || - 'A' <= ch && ch <= 'Z' || - '_' === ch || ch === '$'); - }, - - isExpOperator: function(ch) { - return (ch === '-' || ch === '+' || this.isNumber(ch)); - }, - - throwError: function(error, start, end) { - end = end || this.index; - var colStr = (isDefined(start) - ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']' - : ' ' + end); - throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].', - error, colStr, this.text); - }, - - readNumber: function() { - var number = ''; - var start = this.index; - while (this.index < this.text.length) { - var ch = lowercase(this.text.charAt(this.index)); - if (ch == '.' || this.isNumber(ch)) { - number += ch; - } else { - var peekCh = this.peek(); - if (ch == 'e' && this.isExpOperator(peekCh)) { - number += ch; - } else if (this.isExpOperator(ch) && - peekCh && this.isNumber(peekCh) && - number.charAt(number.length - 1) == 'e') { - number += ch; - } else if (this.isExpOperator(ch) && - (!peekCh || !this.isNumber(peekCh)) && - number.charAt(number.length - 1) == 'e') { - this.throwError('Invalid exponent'); - } else { - break; - } - } - this.index++; - } - this.tokens.push({ - index: start, - text: number, - constant: true, - value: Number(number) - }); - }, - - readIdent: function() { - var start = this.index; - while (this.index < this.text.length) { - var ch = this.text.charAt(this.index); - if (!(this.isIdent(ch) || this.isNumber(ch))) { - break; - } - this.index++; - } - this.tokens.push({ - index: start, - text: this.text.slice(start, this.index), - identifier: true - }); - }, - - readString: function(quote) { - var start = this.index; - this.index++; - var string = ''; - var rawString = quote; - var escape = false; - while (this.index < this.text.length) { - var ch = this.text.charAt(this.index); - rawString += ch; - if (escape) { - if (ch === 'u') { - var hex = this.text.substring(this.index + 1, this.index + 5); - if (!hex.match(/[\da-f]{4}/i)) - this.throwError('Invalid unicode escape [\\u' + hex + ']'); - this.index += 4; - string += String.fromCharCode(parseInt(hex, 16)); - } else { - var rep = ESCAPE[ch]; - string = string + (rep || ch); - } - escape = false; - } else if (ch === '\\') { - escape = true; - } else if (ch === quote) { - this.index++; - this.tokens.push({ - index: start, - text: rawString, - constant: true, - value: string - }); - return; - } else { - string += ch; - } - this.index++; - } - this.throwError('Unterminated quote', start); - } -}; - - -function isConstant(exp) { - return exp.constant; -} - -/** - * @constructor - */ -var Parser = function(lexer, $filter, options) { - this.lexer = lexer; - this.$filter = $filter; - this.options = options; -}; - -Parser.ZERO = extend(function() { - return 0; -}, { - sharedGetter: true, - constant: true -}); - -Parser.prototype = { - constructor: Parser, - - parse: function(text) { - this.text = text; - this.tokens = this.lexer.lex(text); - - var value = this.statements(); - - if (this.tokens.length !== 0) { - this.throwError('is an unexpected token', this.tokens[0]); - } - - value.literal = !!value.literal; - value.constant = !!value.constant; - - return value; - }, - - primary: function() { - var primary; - if (this.expect('(')) { - primary = this.filterChain(); - this.consume(')'); - } else if (this.expect('[')) { - primary = this.arrayDeclaration(); - } else if (this.expect('{')) { - primary = this.object(); - } else if (this.peek().identifier && this.peek().text in CONSTANTS) { - primary = CONSTANTS[this.consume().text]; - } else if (this.peek().identifier) { - primary = this.identifier(); - } else if (this.peek().constant) { - primary = this.constant(); - } else { - this.throwError('not a primary expression', this.peek()); - } - - var next, context; - while ((next = this.expect('(', '[', '.'))) { - if (next.text === '(') { - primary = this.functionCall(primary, context); - context = null; - } else if (next.text === '[') { - context = primary; - primary = this.objectIndex(primary); - } else if (next.text === '.') { - context = primary; - primary = this.fieldAccess(primary); - } else { - this.throwError('IMPOSSIBLE'); - } - } - return primary; - }, - - throwError: function(msg, token) { - throw $parseMinErr('syntax', - 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].', - token.text, msg, (token.index + 1), this.text, this.text.substring(token.index)); - }, - - peekToken: function() { - if (this.tokens.length === 0) - throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); - return this.tokens[0]; - }, - - peek: function(e1, e2, e3, e4) { - return this.peekAhead(0, e1, e2, e3, e4); - }, - peekAhead: function(i, e1, e2, e3, e4) { - if (this.tokens.length > i) { - var token = this.tokens[i]; - var t = token.text; - if (t === e1 || t === e2 || t === e3 || t === e4 || - (!e1 && !e2 && !e3 && !e4)) { - return token; - } - } - return false; - }, - - expect: function(e1, e2, e3, e4) { - var token = this.peek(e1, e2, e3, e4); - if (token) { - this.tokens.shift(); - return token; - } - return false; - }, - - consume: function(e1) { - if (this.tokens.length === 0) { - throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text); - } - - var token = this.expect(e1); - if (!token) { - this.throwError('is unexpected, expecting [' + e1 + ']', this.peek()); - } - return token; - }, - - unaryFn: function(op, right) { - var fn = OPERATORS[op]; - return extend(function $parseUnaryFn(self, locals) { - return fn(self, locals, right); - }, { - constant:right.constant, - inputs: [right] - }); - }, - - binaryFn: function(left, op, right, isBranching) { - var fn = OPERATORS[op]; - return extend(function $parseBinaryFn(self, locals) { - return fn(self, locals, left, right); - }, { - constant: left.constant && right.constant, - inputs: !isBranching && [left, right] - }); - }, - - identifier: function() { - var id = this.consume().text; - - //Continue reading each `.identifier` unless it is a method invocation - while (this.peek('.') && this.peekAhead(1).identifier && !this.peekAhead(2, '(')) { - id += this.consume().text + this.consume().text; - } - - return getterFn(id, this.options, this.text); - }, - - constant: function() { - var value = this.consume().value; - - return extend(function $parseConstant() { - return value; - }, { - constant: true, - literal: true - }); - }, - - statements: function() { - var statements = []; - while (true) { - if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']')) - statements.push(this.filterChain()); - if (!this.expect(';')) { - // optimize for the common case where there is only one statement. - // TODO(size): maybe we should not support multiple statements? - return (statements.length === 1) - ? statements[0] - : function $parseStatements(self, locals) { - var value; - for (var i = 0, ii = statements.length; i < ii; i++) { - value = statements[i](self, locals); - } - return value; - }; - } - } - }, - - filterChain: function() { - var left = this.expression(); - var token; - while ((token = this.expect('|'))) { - left = this.filter(left); - } - return left; - }, - - filter: function(inputFn) { - var fn = this.$filter(this.consume().text); - var argsFn; - var args; - - if (this.peek(':')) { - argsFn = []; - args = []; // we can safely reuse the array - while (this.expect(':')) { - argsFn.push(this.expression()); - } - } - - var inputs = [inputFn].concat(argsFn || []); - - return extend(function $parseFilter(self, locals) { - var input = inputFn(self, locals); - if (args) { - args[0] = input; - - var i = argsFn.length; - while (i--) { - args[i + 1] = argsFn[i](self, locals); - } - - return fn.apply(undefined, args); - } - - return fn(input); - }, { - constant: !fn.$stateful && inputs.every(isConstant), - inputs: !fn.$stateful && inputs - }); - }, - - expression: function() { - return this.assignment(); - }, - - assignment: function() { - var left = this.ternary(); - var right; - var token; - if ((token = this.expect('='))) { - if (!left.assign) { - this.throwError('implies assignment but [' + - this.text.substring(0, token.index) + '] can not be assigned to', token); - } - right = this.ternary(); - return extend(function $parseAssignment(scope, locals) { - return left.assign(scope, right(scope, locals), locals); - }, { - inputs: [left, right] - }); - } - return left; - }, - - ternary: function() { - var left = this.logicalOR(); - var middle; - var token; - if ((token = this.expect('?'))) { - middle = this.assignment(); - if (this.consume(':')) { - var right = this.assignment(); - - return extend(function $parseTernary(self, locals) { - return left(self, locals) ? middle(self, locals) : right(self, locals); - }, { - constant: left.constant && middle.constant && right.constant - }); - } - } - - return left; - }, - - logicalOR: function() { - var left = this.logicalAND(); - var token; - while ((token = this.expect('||'))) { - left = this.binaryFn(left, token.text, this.logicalAND(), true); - } - return left; - }, - - logicalAND: function() { - var left = this.equality(); - var token; - while ((token = this.expect('&&'))) { - left = this.binaryFn(left, token.text, this.equality(), true); - } - return left; - }, - - equality: function() { - var left = this.relational(); - var token; - while ((token = this.expect('==','!=','===','!=='))) { - left = this.binaryFn(left, token.text, this.relational()); - } - return left; - }, - - relational: function() { - var left = this.additive(); - var token; - while ((token = this.expect('<', '>', '<=', '>='))) { - left = this.binaryFn(left, token.text, this.additive()); - } - return left; - }, - - additive: function() { - var left = this.multiplicative(); - var token; - while ((token = this.expect('+','-'))) { - left = this.binaryFn(left, token.text, this.multiplicative()); - } - return left; - }, - - multiplicative: function() { - var left = this.unary(); - var token; - while ((token = this.expect('*','/','%'))) { - left = this.binaryFn(left, token.text, this.unary()); - } - return left; - }, - - unary: function() { - var token; - if (this.expect('+')) { - return this.primary(); - } else if ((token = this.expect('-'))) { - return this.binaryFn(Parser.ZERO, token.text, this.unary()); - } else if ((token = this.expect('!'))) { - return this.unaryFn(token.text, this.unary()); - } else { - return this.primary(); - } - }, - - fieldAccess: function(object) { - var getter = this.identifier(); - - return extend(function $parseFieldAccess(scope, locals, self) { - var o = self || object(scope, locals); - return (o == null) ? undefined : getter(o); - }, { - assign: function(scope, value, locals) { - var o = object(scope, locals); - if (!o) object.assign(scope, o = {}, locals); - return getter.assign(o, value); - } - }); - }, - - objectIndex: function(obj) { - var expression = this.text; - - var indexFn = this.expression(); - this.consume(']'); - - return extend(function $parseObjectIndex(self, locals) { - var o = obj(self, locals), - i = indexFn(self, locals), - v; - - ensureSafeMemberName(i, expression); - if (!o) return undefined; - v = ensureSafeObject(o[i], expression); - return v; - }, { - assign: function(self, value, locals) { - var key = ensureSafeMemberName(indexFn(self, locals), expression); - // prevent overwriting of Function.constructor which would break ensureSafeObject check - var o = ensureSafeObject(obj(self, locals), expression); - if (!o) obj.assign(self, o = {}, locals); - return o[key] = value; - } - }); - }, - - functionCall: function(fnGetter, contextGetter) { - var argsFn = []; - if (this.peekToken().text !== ')') { - do { - argsFn.push(this.expression()); - } while (this.expect(',')); - } - this.consume(')'); - - var expressionText = this.text; - // we can safely reuse the array across invocations - var args = argsFn.length ? [] : null; - - return function $parseFunctionCall(scope, locals) { - var context = contextGetter ? contextGetter(scope, locals) : isDefined(contextGetter) ? undefined : scope; - var fn = fnGetter(scope, locals, context) || noop; - - if (args) { - var i = argsFn.length; - while (i--) { - args[i] = ensureSafeObject(argsFn[i](scope, locals), expressionText); - } - } - - ensureSafeObject(context, expressionText); - ensureSafeFunction(fn, expressionText); - - // IE doesn't have apply for some native functions - var v = fn.apply - ? fn.apply(context, args) - : fn(args[0], args[1], args[2], args[3], args[4]); - - if (args) { - // Free-up the memory (arguments of the last function call). - args.length = 0; - } - - return ensureSafeObject(v, expressionText); - }; - }, - - // This is used with json array declaration - arrayDeclaration: function() { - var elementFns = []; - if (this.peekToken().text !== ']') { - do { - if (this.peek(']')) { - // Support trailing commas per ES5.1. - break; - } - elementFns.push(this.expression()); - } while (this.expect(',')); - } - this.consume(']'); - - return extend(function $parseArrayLiteral(self, locals) { - var array = []; - for (var i = 0, ii = elementFns.length; i < ii; i++) { - array.push(elementFns[i](self, locals)); - } - return array; - }, { - literal: true, - constant: elementFns.every(isConstant), - inputs: elementFns - }); - }, - - object: function() { - var keys = [], valueFns = []; - if (this.peekToken().text !== '}') { - do { - if (this.peek('}')) { - // Support trailing commas per ES5.1. - break; - } - var token = this.consume(); - if (token.constant) { - keys.push(token.value); - } else if (token.identifier) { - keys.push(token.text); - } else { - this.throwError("invalid key", token); - } - this.consume(':'); - valueFns.push(this.expression()); - } while (this.expect(',')); - } - this.consume('}'); - - return extend(function $parseObjectLiteral(self, locals) { - var object = {}; - for (var i = 0, ii = valueFns.length; i < ii; i++) { - object[keys[i]] = valueFns[i](self, locals); - } - return object; - }, { - literal: true, - constant: valueFns.every(isConstant), - inputs: valueFns - }); - } -}; - - -////////////////////////////////////////////////// -// Parser helper functions -////////////////////////////////////////////////// - -function setter(obj, locals, path, setValue, fullExp) { - ensureSafeObject(obj, fullExp); - ensureSafeObject(locals, fullExp); - - var element = path.split('.'), key; - for (var i = 0; element.length > 1; i++) { - key = ensureSafeMemberName(element.shift(), fullExp); - var propertyObj = (i === 0 && locals && locals[key]) || obj[key]; - if (!propertyObj) { - propertyObj = {}; - obj[key] = propertyObj; - } - obj = ensureSafeObject(propertyObj, fullExp); - } - key = ensureSafeMemberName(element.shift(), fullExp); - ensureSafeObject(obj[key], fullExp); - obj[key] = setValue; - return setValue; -} - -var getterFnCacheDefault = createMap(); -var getterFnCacheExpensive = createMap(); - -function isPossiblyDangerousMemberName(name) { - return name == 'constructor'; -} - -/** - * Implementation of the "Black Hole" variant from: - * - http://jsperf.com/angularjs-parse-getter/4 - * - http://jsperf.com/path-evaluation-simplified/7 - */ -function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, expensiveChecks) { - ensureSafeMemberName(key0, fullExp); - ensureSafeMemberName(key1, fullExp); - ensureSafeMemberName(key2, fullExp); - ensureSafeMemberName(key3, fullExp); - ensureSafeMemberName(key4, fullExp); - var eso = function(o) { - return ensureSafeObject(o, fullExp); - }; - var eso0 = (expensiveChecks || isPossiblyDangerousMemberName(key0)) ? eso : identity; - var eso1 = (expensiveChecks || isPossiblyDangerousMemberName(key1)) ? eso : identity; - var eso2 = (expensiveChecks || isPossiblyDangerousMemberName(key2)) ? eso : identity; - var eso3 = (expensiveChecks || isPossiblyDangerousMemberName(key3)) ? eso : identity; - var eso4 = (expensiveChecks || isPossiblyDangerousMemberName(key4)) ? eso : identity; - - return function cspSafeGetter(scope, locals) { - var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope; - - if (pathVal == null) return pathVal; - pathVal = eso0(pathVal[key0]); - - if (!key1) return pathVal; - if (pathVal == null) return undefined; - pathVal = eso1(pathVal[key1]); - - if (!key2) return pathVal; - if (pathVal == null) return undefined; - pathVal = eso2(pathVal[key2]); - - if (!key3) return pathVal; - if (pathVal == null) return undefined; - pathVal = eso3(pathVal[key3]); - - if (!key4) return pathVal; - if (pathVal == null) return undefined; - pathVal = eso4(pathVal[key4]); - - return pathVal; - }; -} - -function getterFnWithEnsureSafeObject(fn, fullExpression) { - return function(s, l) { - return fn(s, l, ensureSafeObject, fullExpression); - }; -} - -function getterFn(path, options, fullExp) { - var expensiveChecks = options.expensiveChecks; - var getterFnCache = (expensiveChecks ? getterFnCacheExpensive : getterFnCacheDefault); - var fn = getterFnCache[path]; - if (fn) return fn; - - - var pathKeys = path.split('.'), - pathKeysLength = pathKeys.length; - - // http://jsperf.com/angularjs-parse-getter/6 - if (options.csp) { - if (pathKeysLength < 6) { - fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, expensiveChecks); - } else { - fn = function cspSafeGetter(scope, locals) { - var i = 0, val; - do { - val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], - pathKeys[i++], fullExp, expensiveChecks)(scope, locals); - - locals = undefined; // clear after first iteration - scope = val; - } while (i < pathKeysLength); - return val; - }; - } - } else { - var code = ''; - if (expensiveChecks) { - code += 's = eso(s, fe);\nl = eso(l, fe);\n'; - } - var needsEnsureSafeObject = expensiveChecks; - forEach(pathKeys, function(key, index) { - ensureSafeMemberName(key, fullExp); - var lookupJs = (index - // we simply dereference 's' on any .dot notation - ? 's' - // but if we are first then we check locals first, and if so read it first - : '((l&&l.hasOwnProperty("' + key + '"))?l:s)') + '.' + key; - if (expensiveChecks || isPossiblyDangerousMemberName(key)) { - lookupJs = 'eso(' + lookupJs + ', fe)'; - needsEnsureSafeObject = true; - } - code += 'if(s == null) return undefined;\n' + - 's=' + lookupJs + ';\n'; - }); - code += 'return s;'; - - /* jshint -W054 */ - var evaledFnGetter = new Function('s', 'l', 'eso', 'fe', code); // s=scope, l=locals, eso=ensureSafeObject - /* jshint +W054 */ - evaledFnGetter.toString = valueFn(code); - if (needsEnsureSafeObject) { - evaledFnGetter = getterFnWithEnsureSafeObject(evaledFnGetter, fullExp); - } - fn = evaledFnGetter; - } - - fn.sharedGetter = true; - fn.assign = function(self, value, locals) { - return setter(self, locals, path, value, path); - }; - getterFnCache[path] = fn; - return fn; -} - -var objectValueOf = Object.prototype.valueOf; - -function getValueOf(value) { - return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value); -} - -/////////////////////////////////// - -/** - * @ngdoc service - * @name $parse - * @kind function - * - * @description - * - * Converts Angular {@link guide/expression expression} into a function. - * - * ```js - * var getter = $parse('user.name'); - * var setter = getter.assign; - * var context = {user:{name:'angular'}}; - * var locals = {user:{name:'local'}}; - * - * expect(getter(context)).toEqual('angular'); - * setter(context, 'newValue'); - * expect(context.user.name).toEqual('newValue'); - * expect(getter(context, locals)).toEqual('local'); - * ``` - * - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - * - * The returned function also has the following properties: - * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript - * literal. - * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript - * constant literals. - * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be - * set to a function to change its value on the given context. - * - */ - - -/** - * @ngdoc provider - * @name $parseProvider - * - * @description - * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse} - * service. - */ -function $ParseProvider() { - var cacheDefault = createMap(); - var cacheExpensive = createMap(); - - - - this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { - var $parseOptions = { - csp: $sniffer.csp, - expensiveChecks: false - }, - $parseOptionsExpensive = { - csp: $sniffer.csp, - expensiveChecks: true - }; - - function wrapSharedExpression(exp) { - var wrapped = exp; - - if (exp.sharedGetter) { - wrapped = function $parseWrapper(self, locals) { - return exp(self, locals); - }; - wrapped.literal = exp.literal; - wrapped.constant = exp.constant; - wrapped.assign = exp.assign; - } - - return wrapped; - } - - return function $parse(exp, interceptorFn, expensiveChecks) { - var parsedExpression, oneTime, cacheKey; - - switch (typeof exp) { - case 'string': - cacheKey = exp = exp.trim(); - - var cache = (expensiveChecks ? cacheExpensive : cacheDefault); - parsedExpression = cache[cacheKey]; - - if (!parsedExpression) { - if (exp.charAt(0) === ':' && exp.charAt(1) === ':') { - oneTime = true; - exp = exp.substring(2); - } - - var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions; - var lexer = new Lexer(parseOptions); - var parser = new Parser(lexer, $filter, parseOptions); - parsedExpression = parser.parse(exp); - - if (parsedExpression.constant) { - parsedExpression.$$watchDelegate = constantWatchDelegate; - } else if (oneTime) { - //oneTime is not part of the exp passed to the Parser so we may have to - //wrap the parsedExpression before adding a $$watchDelegate - parsedExpression = wrapSharedExpression(parsedExpression); - parsedExpression.$$watchDelegate = parsedExpression.literal ? - oneTimeLiteralWatchDelegate : oneTimeWatchDelegate; - } else if (parsedExpression.inputs) { - parsedExpression.$$watchDelegate = inputsWatchDelegate; - } - - cache[cacheKey] = parsedExpression; - } - return addInterceptor(parsedExpression, interceptorFn); - - case 'function': - return addInterceptor(exp, interceptorFn); - - default: - return addInterceptor(noop, interceptorFn); - } - }; - - function collectExpressionInputs(inputs, list) { - for (var i = 0, ii = inputs.length; i < ii; i++) { - var input = inputs[i]; - if (!input.constant) { - if (input.inputs) { - collectExpressionInputs(input.inputs, list); - } else if (list.indexOf(input) === -1) { // TODO(perf) can we do better? - list.push(input); - } - } - } - - return list; - } - - function expressionInputDirtyCheck(newValue, oldValueOfValue) { - - if (newValue == null || oldValueOfValue == null) { // null/undefined - return newValue === oldValueOfValue; - } - - if (typeof newValue === 'object') { - - // attempt to convert the value to a primitive type - // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can - // be cheaply dirty-checked - newValue = getValueOf(newValue); - - if (typeof newValue === 'object') { - // objects/arrays are not supported - deep-watching them would be too expensive - return false; - } - - // fall-through to the primitive equality check - } - - //Primitive or NaN - return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue); - } - - function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var inputExpressions = parsedExpression.$$inputs || - (parsedExpression.$$inputs = collectExpressionInputs(parsedExpression.inputs, [])); - - var lastResult; - - if (inputExpressions.length === 1) { - var oldInputValue = expressionInputDirtyCheck; // init to something unique so that equals check fails - inputExpressions = inputExpressions[0]; - return scope.$watch(function expressionInputWatch(scope) { - var newInputValue = inputExpressions(scope); - if (!expressionInputDirtyCheck(newInputValue, oldInputValue)) { - lastResult = parsedExpression(scope); - oldInputValue = newInputValue && getValueOf(newInputValue); - } - return lastResult; - }, listener, objectEquality); - } - - var oldInputValueOfValues = []; - for (var i = 0, ii = inputExpressions.length; i < ii; i++) { - oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails - } - - return scope.$watch(function expressionInputsWatch(scope) { - var changed = false; - - for (var i = 0, ii = inputExpressions.length; i < ii; i++) { - var newInputValue = inputExpressions[i](scope); - if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) { - oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue); - } - } - - if (changed) { - lastResult = parsedExpression(scope); - } - - return lastResult; - }, listener, objectEquality); - } - - function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var unwatch, lastValue; - return unwatch = scope.$watch(function oneTimeWatch(scope) { - return parsedExpression(scope); - }, function oneTimeListener(value, old, scope) { - lastValue = value; - if (isFunction(listener)) { - listener.apply(this, arguments); - } - if (isDefined(value)) { - scope.$$postDigest(function() { - if (isDefined(lastValue)) { - unwatch(); - } - }); - } - }, objectEquality); - } - - function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var unwatch, lastValue; - return unwatch = scope.$watch(function oneTimeWatch(scope) { - return parsedExpression(scope); - }, function oneTimeListener(value, old, scope) { - lastValue = value; - if (isFunction(listener)) { - listener.call(this, value, old, scope); - } - if (isAllDefined(value)) { - scope.$$postDigest(function() { - if (isAllDefined(lastValue)) unwatch(); - }); - } - }, objectEquality); - - function isAllDefined(value) { - var allDefined = true; - forEach(value, function(val) { - if (!isDefined(val)) allDefined = false; - }); - return allDefined; - } - } - - function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) { - var unwatch; - return unwatch = scope.$watch(function constantWatch(scope) { - return parsedExpression(scope); - }, function constantListener(value, old, scope) { - if (isFunction(listener)) { - listener.apply(this, arguments); - } - unwatch(); - }, objectEquality); - } - - function addInterceptor(parsedExpression, interceptorFn) { - if (!interceptorFn) return parsedExpression; - var watchDelegate = parsedExpression.$$watchDelegate; - - var regularWatch = - watchDelegate !== oneTimeLiteralWatchDelegate && - watchDelegate !== oneTimeWatchDelegate; - - var fn = regularWatch ? function regularInterceptedExpression(scope, locals) { - var value = parsedExpression(scope, locals); - return interceptorFn(value, scope, locals); - } : function oneTimeInterceptedExpression(scope, locals) { - var value = parsedExpression(scope, locals); - var result = interceptorFn(value, scope, locals); - // we only return the interceptor's result if the - // initial value is defined (for bind-once) - return isDefined(value) ? result : value; - }; - - // Propagate $$watchDelegates other then inputsWatchDelegate - if (parsedExpression.$$watchDelegate && - parsedExpression.$$watchDelegate !== inputsWatchDelegate) { - fn.$$watchDelegate = parsedExpression.$$watchDelegate; - } else if (!interceptorFn.$stateful) { - // If there is an interceptor, but no watchDelegate then treat the interceptor like - // we treat filters - it is assumed to be a pure function unless flagged with $stateful - fn.$$watchDelegate = inputsWatchDelegate; - fn.inputs = [parsedExpression]; - } - - return fn; - } - }]; -} - -/** - * @ngdoc service - * @name $q - * @requires $rootScope - * - * @description - * A service that helps you run functions asynchronously, and use their return values (or exceptions) - * when they are done processing. - * - * This is an implementation of promises/deferred objects inspired by - * [Kris Kowal's Q](https://github.com/kriskowal/q). - * - * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred - * implementations, and the other which resembles ES6 promises to some degree. - * - * # $q constructor - * - * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver` - * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony, - * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). - * - * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are - * available yet. - * - * It can be used like so: - * - * ```js - * // for the purpose of this example let's assume that variables `$q` and `okToGreet` - * // are available in the current lexical scope (they could have been injected or passed in). - * - * function asyncGreet(name) { - * // perform some asynchronous operation, resolve or reject the promise when appropriate. - * return $q(function(resolve, reject) { - * setTimeout(function() { - * if (okToGreet(name)) { - * resolve('Hello, ' + name + '!'); - * } else { - * reject('Greeting ' + name + ' is not allowed.'); - * } - * }, 1000); - * }); - * } - * - * var promise = asyncGreet('Robin Hood'); - * promise.then(function(greeting) { - * alert('Success: ' + greeting); - * }, function(reason) { - * alert('Failed: ' + reason); - * }); - * ``` - * - * Note: progress/notify callbacks are not currently supported via the ES6-style interface. - * - * However, the more traditional CommonJS-style usage is still available, and documented below. - * - * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an - * interface for interacting with an object that represents the result of an action that is - * performed asynchronously, and may or may not be finished at any given point in time. - * - * From the perspective of dealing with error handling, deferred and promise APIs are to - * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. - * - * ```js - * // for the purpose of this example let's assume that variables `$q` and `okToGreet` - * // are available in the current lexical scope (they could have been injected or passed in). - * - * function asyncGreet(name) { - * var deferred = $q.defer(); - * - * setTimeout(function() { - * deferred.notify('About to greet ' + name + '.'); - * - * if (okToGreet(name)) { - * deferred.resolve('Hello, ' + name + '!'); - * } else { - * deferred.reject('Greeting ' + name + ' is not allowed.'); - * } - * }, 1000); - * - * return deferred.promise; - * } - * - * var promise = asyncGreet('Robin Hood'); - * promise.then(function(greeting) { - * alert('Success: ' + greeting); - * }, function(reason) { - * alert('Failed: ' + reason); - * }, function(update) { - * alert('Got notification: ' + update); - * }); - * ``` - * - * At first it might not be obvious why this extra complexity is worth the trouble. The payoff - * comes in the way of guarantees that promise and deferred APIs make, see - * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md. - * - * Additionally the promise api allows for composition that is very hard to do with the - * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. - * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the - * section on serial or parallel joining of promises. - * - * # The Deferred API - * - * A new instance of deferred is constructed by calling `$q.defer()`. - * - * The purpose of the deferred object is to expose the associated Promise instance as well as APIs - * that can be used for signaling the successful or unsuccessful completion, as well as the status - * of the task. - * - * **Methods** - * - * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection - * constructed via `$q.reject`, the promise will be rejected instead. - * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to - * resolving it with a rejection constructed via `$q.reject`. - * - `notify(value)` - provides updates on the status of the promise's execution. This may be called - * multiple times before the promise is either resolved or rejected. - * - * **Properties** - * - * - promise – `{Promise}` – promise object associated with this deferred. - * - * - * # The Promise API - * - * A new promise instance is created when a deferred instance is created and can be retrieved by - * calling `deferred.promise`. - * - * The purpose of the promise object is to allow for interested parties to get access to the result - * of the deferred task when it completes. - * - * **Methods** - * - * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or - * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously - * as soon as the result is available. The callbacks are called with a single argument: the result - * or rejection reason. Additionally, the notify callback may be called zero or more times to - * provide a progress indication, before the promise is resolved or rejected. - * - * This method *returns a new promise* which is resolved or rejected via the return value of the - * `successCallback`, `errorCallback`. It also notifies via the return value of the - * `notifyCallback` method. The promise cannot be resolved or rejected from the notifyCallback - * method. - * - * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)` - * - * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise, - * but to do so without modifying the final value. This is useful to release resources or do some - * clean-up that needs to be done whether the promise was rejected or resolved. See the [full - * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for - * more information. - * - * # Chaining promises - * - * Because calling the `then` method of a promise returns a new derived promise, it is easily - * possible to create a chain of promises: - * - * ```js - * promiseB = promiseA.then(function(result) { - * return result + 1; - * }); - * - * // promiseB will be resolved immediately after promiseA is resolved and its value - * // will be the result of promiseA incremented by 1 - * ``` - * - * It is possible to create chains of any length and since a promise can be resolved with another - * promise (which will defer its resolution further), it is possible to pause/defer resolution of - * the promises at any point in the chain. This makes it possible to implement powerful APIs like - * $http's response interceptors. - * - * - * # Differences between Kris Kowal's Q and $q - * - * There are two main differences: - * - * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation - * mechanism in angular, which means faster propagation of resolution or rejection into your - * models and avoiding unnecessary browser repaints, which would result in flickering UI. - * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains - * all the important functionality needed for common async tasks. - * - * # Testing - * - * ```js - * it('should simulate promise', inject(function($q, $rootScope) { - * var deferred = $q.defer(); - * var promise = deferred.promise; - * var resolvedValue; - * - * promise.then(function(value) { resolvedValue = value; }); - * expect(resolvedValue).toBeUndefined(); - * - * // Simulate resolving of promise - * deferred.resolve(123); - * // Note that the 'then' function does not get called synchronously. - * // This is because we want the promise API to always be async, whether or not - * // it got called synchronously or asynchronously. - * expect(resolvedValue).toBeUndefined(); - * - * // Propagate promise resolution to 'then' functions using $apply(). - * $rootScope.$apply(); - * expect(resolvedValue).toEqual(123); - * })); - * ``` - * - * @param {function(function, function)} resolver Function which is responsible for resolving or - * rejecting the newly created promise. The first parameter is a function which resolves the - * promise, the second parameter is a function which rejects the promise. - * - * @returns {Promise} The newly created promise. - */ -function $QProvider() { - - this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { - return qFactory(function(callback) { - $rootScope.$evalAsync(callback); - }, $exceptionHandler); - }]; -} - -function $$QProvider() { - this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) { - return qFactory(function(callback) { - $browser.defer(callback); - }, $exceptionHandler); - }]; -} - -/** - * Constructs a promise manager. - * - * @param {function(function)} nextTick Function for executing functions in the next turn. - * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for - * debugging purposes. - * @returns {object} Promise manager. - */ -function qFactory(nextTick, exceptionHandler) { - var $qMinErr = minErr('$q', TypeError); - function callOnce(self, resolveFn, rejectFn) { - var called = false; - function wrap(fn) { - return function(value) { - if (called) return; - called = true; - fn.call(self, value); - }; - } - - return [wrap(resolveFn), wrap(rejectFn)]; - } - - /** - * @ngdoc method - * @name ng.$q#defer - * @kind function - * - * @description - * Creates a `Deferred` object which represents a task which will finish in the future. - * - * @returns {Deferred} Returns a new instance of deferred. - */ - var defer = function() { - return new Deferred(); - }; - - function Promise() { - this.$$state = { status: 0 }; - } - - Promise.prototype = { - then: function(onFulfilled, onRejected, progressBack) { - var result = new Deferred(); - - this.$$state.pending = this.$$state.pending || []; - this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]); - if (this.$$state.status > 0) scheduleProcessQueue(this.$$state); - - return result.promise; - }, - - "catch": function(callback) { - return this.then(null, callback); - }, - - "finally": function(callback, progressBack) { - return this.then(function(value) { - return handleCallback(value, true, callback); - }, function(error) { - return handleCallback(error, false, callback); - }, progressBack); - } - }; - - //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native - function simpleBind(context, fn) { - return function(value) { - fn.call(context, value); - }; - } - - function processQueue(state) { - var fn, promise, pending; - - pending = state.pending; - state.processScheduled = false; - state.pending = undefined; - for (var i = 0, ii = pending.length; i < ii; ++i) { - promise = pending[i][0]; - fn = pending[i][state.status]; - try { - if (isFunction(fn)) { - promise.resolve(fn(state.value)); - } else if (state.status === 1) { - promise.resolve(state.value); - } else { - promise.reject(state.value); - } - } catch (e) { - promise.reject(e); - exceptionHandler(e); - } - } - } - - function scheduleProcessQueue(state) { - if (state.processScheduled || !state.pending) return; - state.processScheduled = true; - nextTick(function() { processQueue(state); }); - } - - function Deferred() { - this.promise = new Promise(); - //Necessary to support unbound execution :/ - this.resolve = simpleBind(this, this.resolve); - this.reject = simpleBind(this, this.reject); - this.notify = simpleBind(this, this.notify); - } - - Deferred.prototype = { - resolve: function(val) { - if (this.promise.$$state.status) return; - if (val === this.promise) { - this.$$reject($qMinErr( - 'qcycle', - "Expected promise to be resolved with value other than itself '{0}'", - val)); - } else { - this.$$resolve(val); - } - - }, - - $$resolve: function(val) { - var then, fns; - - fns = callOnce(this, this.$$resolve, this.$$reject); - try { - if ((isObject(val) || isFunction(val))) then = val && val.then; - if (isFunction(then)) { - this.promise.$$state.status = -1; - then.call(val, fns[0], fns[1], this.notify); - } else { - this.promise.$$state.value = val; - this.promise.$$state.status = 1; - scheduleProcessQueue(this.promise.$$state); - } - } catch (e) { - fns[1](e); - exceptionHandler(e); - } - }, - - reject: function(reason) { - if (this.promise.$$state.status) return; - this.$$reject(reason); - }, - - $$reject: function(reason) { - this.promise.$$state.value = reason; - this.promise.$$state.status = 2; - scheduleProcessQueue(this.promise.$$state); - }, - - notify: function(progress) { - var callbacks = this.promise.$$state.pending; - - if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) { - nextTick(function() { - var callback, result; - for (var i = 0, ii = callbacks.length; i < ii; i++) { - result = callbacks[i][0]; - callback = callbacks[i][3]; - try { - result.notify(isFunction(callback) ? callback(progress) : progress); - } catch (e) { - exceptionHandler(e); - } - } - }); - } - } - }; - - /** - * @ngdoc method - * @name $q#reject - * @kind function - * - * @description - * Creates a promise that is resolved as rejected with the specified `reason`. This api should be - * used to forward rejection in a chain of promises. If you are dealing with the last promise in - * a promise chain, you don't need to worry about it. - * - * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of - * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via - * a promise error callback and you want to forward the error to the promise derived from the - * current promise, you have to "rethrow" the error by returning a rejection constructed via - * `reject`. - * - * ```js - * promiseB = promiseA.then(function(result) { - * // success: do something and resolve promiseB - * // with the old or a new result - * return result; - * }, function(reason) { - * // error: handle the error if possible and - * // resolve promiseB with newPromiseOrValue, - * // otherwise forward the rejection to promiseB - * if (canHandle(reason)) { - * // handle the error and recover - * return newPromiseOrValue; - * } - * return $q.reject(reason); - * }); - * ``` - * - * @param {*} reason Constant, message, exception or an object representing the rejection reason. - * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. - */ - var reject = function(reason) { - var result = new Deferred(); - result.reject(reason); - return result.promise; - }; - - var makePromise = function makePromise(value, resolved) { - var result = new Deferred(); - if (resolved) { - result.resolve(value); - } else { - result.reject(value); - } - return result.promise; - }; - - var handleCallback = function handleCallback(value, isResolved, callback) { - var callbackOutput = null; - try { - if (isFunction(callback)) callbackOutput = callback(); - } catch (e) { - return makePromise(e, false); - } - if (isPromiseLike(callbackOutput)) { - return callbackOutput.then(function() { - return makePromise(value, isResolved); - }, function(error) { - return makePromise(error, false); - }); - } else { - return makePromise(value, isResolved); - } - }; - - /** - * @ngdoc method - * @name $q#when - * @kind function - * - * @description - * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. - * This is useful when you are dealing with an object that might or might not be a promise, or if - * the promise comes from a source that can't be trusted. - * - * @param {*} value Value or a promise - * @returns {Promise} Returns a promise of the passed value or promise - */ - - - var when = function(value, callback, errback, progressBack) { - var result = new Deferred(); - result.resolve(value); - return result.promise.then(callback, errback, progressBack); - }; - - /** - * @ngdoc method - * @name $q#all - * @kind function - * - * @description - * Combines multiple promises into a single promise that is resolved when all of the input - * promises are resolved. - * - * @param {Array.|Object.} promises An array or hash of promises. - * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values, - * each value corresponding to the promise at the same index/key in the `promises` array/hash. - * If any of the promises is resolved with a rejection, this resulting promise will be rejected - * with the same rejection value. - */ - - function all(promises) { - var deferred = new Deferred(), - counter = 0, - results = isArray(promises) ? [] : {}; - - forEach(promises, function(promise, key) { - counter++; - when(promise).then(function(value) { - if (results.hasOwnProperty(key)) return; - results[key] = value; - if (!(--counter)) deferred.resolve(results); - }, function(reason) { - if (results.hasOwnProperty(key)) return; - deferred.reject(reason); - }); - }); - - if (counter === 0) { - deferred.resolve(results); - } - - return deferred.promise; - } - - var $Q = function Q(resolver) { - if (!isFunction(resolver)) { - throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver); - } - - if (!(this instanceof Q)) { - // More useful when $Q is the Promise itself. - return new Q(resolver); - } - - var deferred = new Deferred(); - - function resolveFn(value) { - deferred.resolve(value); - } - - function rejectFn(reason) { - deferred.reject(reason); - } - - resolver(resolveFn, rejectFn); - - return deferred.promise; - }; - - $Q.defer = defer; - $Q.reject = reject; - $Q.when = when; - $Q.all = all; - - return $Q; -} - -function $$RAFProvider() { //rAF - this.$get = ['$window', '$timeout', function($window, $timeout) { - var requestAnimationFrame = $window.requestAnimationFrame || - $window.webkitRequestAnimationFrame; - - var cancelAnimationFrame = $window.cancelAnimationFrame || - $window.webkitCancelAnimationFrame || - $window.webkitCancelRequestAnimationFrame; - - var rafSupported = !!requestAnimationFrame; - var raf = rafSupported - ? function(fn) { - var id = requestAnimationFrame(fn); - return function() { - cancelAnimationFrame(id); - }; - } - : function(fn) { - var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 - return function() { - $timeout.cancel(timer); - }; - }; - - raf.supported = rafSupported; - - return raf; - }]; -} - -/** - * DESIGN NOTES - * - * The design decisions behind the scope are heavily favored for speed and memory consumption. - * - * The typical use of scope is to watch the expressions, which most of the time return the same - * value as last time so we optimize the operation. - * - * Closures construction is expensive in terms of speed as well as memory: - * - No closures, instead use prototypical inheritance for API - * - Internal state needs to be stored on scope directly, which means that private state is - * exposed as $$____ properties - * - * Loop operations are optimized by using while(count--) { ... } - * - this means that in order to keep the same order of execution as addition we have to add - * items to the array at the beginning (unshift) instead of at the end (push) - * - * Child scopes are created and removed often - * - Using an array would be slow since inserts in middle are expensive so we use linked list - * - * There are few watches then a lot of observers. This is why you don't want the observer to be - * implemented in the same way as watch. Watch requires return of initialization function which - * are expensive to construct. - */ - - -/** - * @ngdoc provider - * @name $rootScopeProvider - * @description - * - * Provider for the $rootScope service. - */ - -/** - * @ngdoc method - * @name $rootScopeProvider#digestTtl - * @description - * - * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and - * assuming that the model is unstable. - * - * The current default is 10 iterations. - * - * In complex applications it's possible that the dependencies between `$watch`s will result in - * several digest iterations. However if an application needs more than the default 10 digest - * iterations for its model to stabilize then you should investigate what is causing the model to - * continuously change during the digest. - * - * Increasing the TTL could have performance implications, so you should not change it without - * proper justification. - * - * @param {number} limit The number of digest iterations. - */ - - -/** - * @ngdoc service - * @name $rootScope - * @description - * - * Every application has a single root {@link ng.$rootScope.Scope scope}. - * All other scopes are descendant scopes of the root scope. Scopes provide separation - * between the model and the view, via a mechanism for watching the model for changes. - * They also provide an event emission/broadcast and subscription facility. See the - * {@link guide/scope developer guide on scopes}. - */ -function $RootScopeProvider() { - var TTL = 10; - var $rootScopeMinErr = minErr('$rootScope'); - var lastDirtyWatch = null; - var applyAsyncId = null; - - this.digestTtl = function(value) { - if (arguments.length) { - TTL = value; - } - return TTL; - }; - - this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser', - function($injector, $exceptionHandler, $parse, $browser) { - - /** - * @ngdoc type - * @name $rootScope.Scope - * - * @description - * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the - * {@link auto.$injector $injector}. Child scopes are created using the - * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when - * compiled HTML template is executed.) - * - * Here is a simple scope snippet to show how you can interact with the scope. - * ```html - * - * ``` - * - * # Inheritance - * A scope can inherit from a parent scope, as in this example: - * ```js - var parent = $rootScope; - var child = parent.$new(); - - parent.salutation = "Hello"; - expect(child.salutation).toEqual('Hello'); - - child.salutation = "Welcome"; - expect(child.salutation).toEqual('Welcome'); - expect(parent.salutation).toEqual('Hello'); - * ``` - * - * When interacting with `Scope` in tests, additional helper methods are available on the - * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional - * details. - * - * - * @param {Object.=} providers Map of service factory which need to be - * provided for the current scope. Defaults to {@link ng}. - * @param {Object.=} instanceCache Provides pre-instantiated services which should - * append/override services provided by `providers`. This is handy - * when unit-testing and having the need to override a default - * service. - * @returns {Object} Newly created scope. - * - */ - function Scope() { - this.$id = nextUid(); - this.$$phase = this.$parent = this.$$watchers = - this.$$nextSibling = this.$$prevSibling = - this.$$childHead = this.$$childTail = null; - this.$root = this; - this.$$destroyed = false; - this.$$listeners = {}; - this.$$listenerCount = {}; - this.$$isolateBindings = null; - } - - /** - * @ngdoc property - * @name $rootScope.Scope#$id - * - * @description - * Unique scope ID (monotonically increasing) useful for debugging. - */ - - /** - * @ngdoc property - * @name $rootScope.Scope#$parent - * - * @description - * Reference to the parent scope. - */ - - /** - * @ngdoc property - * @name $rootScope.Scope#$root - * - * @description - * Reference to the root scope. - */ - - Scope.prototype = { - constructor: Scope, - /** - * @ngdoc method - * @name $rootScope.Scope#$new - * @kind function - * - * @description - * Creates a new child {@link ng.$rootScope.Scope scope}. - * - * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event. - * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. - * - * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is - * desired for the scope and its child scopes to be permanently detached from the parent and - * thus stop participating in model change detection and listener notification by invoking. - * - * @param {boolean} isolate If true, then the scope does not prototypically inherit from the - * parent scope. The scope is isolated, as it can not see parent scope properties. - * When creating widgets, it is useful for the widget to not accidentally read parent - * state. - * - * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent` - * of the newly created scope. Defaults to `this` scope if not provided. - * This is used when creating a transclude scope to correctly place it - * in the scope hierarchy while maintaining the correct prototypical - * inheritance. - * - * @returns {Object} The newly created child scope. - * - */ - $new: function(isolate, parent) { - var child; - - parent = parent || this; - - if (isolate) { - child = new Scope(); - child.$root = this.$root; - } else { - // Only create a child scope class if somebody asks for one, - // but cache it to allow the VM to optimize lookups. - if (!this.$$ChildScope) { - this.$$ChildScope = function ChildScope() { - this.$$watchers = this.$$nextSibling = - this.$$childHead = this.$$childTail = null; - this.$$listeners = {}; - this.$$listenerCount = {}; - this.$id = nextUid(); - this.$$ChildScope = null; - }; - this.$$ChildScope.prototype = this; - } - child = new this.$$ChildScope(); - } - child.$parent = parent; - child.$$prevSibling = parent.$$childTail; - if (parent.$$childHead) { - parent.$$childTail.$$nextSibling = child; - parent.$$childTail = child; - } else { - parent.$$childHead = parent.$$childTail = child; - } - - // When the new scope is not isolated or we inherit from `this`, and - // the parent scope is destroyed, the property `$$destroyed` is inherited - // prototypically. In all other cases, this property needs to be set - // when the parent scope is destroyed. - // The listener needs to be added after the parent is set - if (isolate || parent != this) child.$on('$destroy', destroyChild); - - return child; - - function destroyChild() { - child.$$destroyed = true; - } - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$watch - * @kind function - * - * @description - * Registers a `listener` callback to be executed whenever the `watchExpression` changes. - * - * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest - * $digest()} and should return the value that will be watched. (Since - * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the - * `watchExpression` can execute multiple times per - * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) - * - The `listener` is called only when the value from the current `watchExpression` and the - * previous call to `watchExpression` are not equal (with the exception of the initial run, - * see below). Inequality is determined according to reference inequality, - * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators) - * via the `!==` Javascript operator, unless `objectEquality == true` - * (see next point) - * - When `objectEquality == true`, inequality of the `watchExpression` is determined - * according to the {@link angular.equals} function. To save the value of the object for - * later comparison, the {@link angular.copy} function is used. This therefore means that - * watching complex objects will have adverse memory and performance implications. - * - The watch `listener` may change the model, which may trigger other `listener`s to fire. - * This is achieved by rerunning the watchers until no changes are detected. The rerun - * iteration limit is 10 to prevent an infinite loop deadlock. - * - * - * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, - * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` - * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a - * change is detected, be prepared for multiple calls to your listener.) - * - * After a watcher is registered with the scope, the `listener` fn is called asynchronously - * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the - * watcher. In rare cases, this is undesirable because the listener is called when the result - * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you - * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the - * listener was called due to initialization. - * - * - * - * # Example - * ```js - // let's assume that scope was dependency injected as the $rootScope - var scope = $rootScope; - scope.name = 'misko'; - scope.counter = 0; - - expect(scope.counter).toEqual(0); - scope.$watch('name', function(newValue, oldValue) { - scope.counter = scope.counter + 1; - }); - expect(scope.counter).toEqual(0); - - scope.$digest(); - // the listener is always called during the first $digest loop after it was registered - expect(scope.counter).toEqual(1); - - scope.$digest(); - // but now it will not be called unless the value changes - expect(scope.counter).toEqual(1); - - scope.name = 'adam'; - scope.$digest(); - expect(scope.counter).toEqual(2); - - - - // Using a function as a watchExpression - var food; - scope.foodCounter = 0; - expect(scope.foodCounter).toEqual(0); - scope.$watch( - // This function returns the value being watched. It is called for each turn of the $digest loop - function() { return food; }, - // This is the change listener, called when the value returned from the above function changes - function(newValue, oldValue) { - if ( newValue !== oldValue ) { - // Only increment the counter if the value changed - scope.foodCounter = scope.foodCounter + 1; - } - } - ); - // No digest has been run so the counter will be zero - expect(scope.foodCounter).toEqual(0); - - // Run the digest but since food has not changed count will still be zero - scope.$digest(); - expect(scope.foodCounter).toEqual(0); - - // Update food and run digest. Now the counter will increment - food = 'cheeseburger'; - scope.$digest(); - expect(scope.foodCounter).toEqual(1); - - * ``` - * - * - * - * @param {(function()|string)} watchExpression Expression that is evaluated on each - * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers - * a call to the `listener`. - * - * - `string`: Evaluated as {@link guide/expression expression} - * - `function(scope)`: called with current `scope` as a parameter. - * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value - * of `watchExpression` changes. - * - * - `newVal` contains the current value of the `watchExpression` - * - `oldVal` contains the previous value of the `watchExpression` - * - `scope` refers to the current scope - * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of - * comparing for reference equality. - * @returns {function()} Returns a deregistration function for this listener. - */ - $watch: function(watchExp, listener, objectEquality) { - var get = $parse(watchExp); - - if (get.$$watchDelegate) { - return get.$$watchDelegate(this, listener, objectEquality, get); - } - var scope = this, - array = scope.$$watchers, - watcher = { - fn: listener, - last: initWatchVal, - get: get, - exp: watchExp, - eq: !!objectEquality - }; - - lastDirtyWatch = null; - - if (!isFunction(listener)) { - watcher.fn = noop; - } - - if (!array) { - array = scope.$$watchers = []; - } - // we use unshift since we use a while loop in $digest for speed. - // the while loop reads in reverse order. - array.unshift(watcher); - - return function deregisterWatch() { - arrayRemove(array, watcher); - lastDirtyWatch = null; - }; - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$watchGroup - * @kind function - * - * @description - * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`. - * If any one expression in the collection changes the `listener` is executed. - * - * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every - * call to $digest() to see if any items changes. - * - The `listener` is called whenever any expression in the `watchExpressions` array changes. - * - * @param {Array.} watchExpressions Array of expressions that will be individually - * watched using {@link ng.$rootScope.Scope#$watch $watch()} - * - * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any - * expression in `watchExpressions` changes - * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching - * those of `watchExpression` - * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching - * those of `watchExpression` - * The `scope` refers to the current scope. - * @returns {function()} Returns a de-registration function for all listeners. - */ - $watchGroup: function(watchExpressions, listener) { - var oldValues = new Array(watchExpressions.length); - var newValues = new Array(watchExpressions.length); - var deregisterFns = []; - var self = this; - var changeReactionScheduled = false; - var firstRun = true; - - if (!watchExpressions.length) { - // No expressions means we call the listener ASAP - var shouldCall = true; - self.$evalAsync(function() { - if (shouldCall) listener(newValues, newValues, self); - }); - return function deregisterWatchGroup() { - shouldCall = false; - }; - } - - if (watchExpressions.length === 1) { - // Special case size of one - return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) { - newValues[0] = value; - oldValues[0] = oldValue; - listener(newValues, (value === oldValue) ? newValues : oldValues, scope); - }); - } - - forEach(watchExpressions, function(expr, i) { - var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) { - newValues[i] = value; - oldValues[i] = oldValue; - if (!changeReactionScheduled) { - changeReactionScheduled = true; - self.$evalAsync(watchGroupAction); - } - }); - deregisterFns.push(unwatchFn); - }); - - function watchGroupAction() { - changeReactionScheduled = false; - - if (firstRun) { - firstRun = false; - listener(newValues, newValues, self); - } else { - listener(newValues, oldValues, self); - } - } - - return function deregisterWatchGroup() { - while (deregisterFns.length) { - deregisterFns.shift()(); - } - }; - }, - - - /** - * @ngdoc method - * @name $rootScope.Scope#$watchCollection - * @kind function - * - * @description - * Shallow watches the properties of an object and fires whenever any of the properties change - * (for arrays, this implies watching the array items; for object maps, this implies watching - * the properties). If a change is detected, the `listener` callback is fired. - * - * - The `obj` collection is observed via standard $watch operation and is examined on every - * call to $digest() to see if any items have been added, removed, or moved. - * - The `listener` is called whenever anything within the `obj` has changed. Examples include - * adding, removing, and moving items belonging to an object or array. - * - * - * # Example - * ```js - $scope.names = ['igor', 'matias', 'misko', 'james']; - $scope.dataCount = 4; - - $scope.$watchCollection('names', function(newNames, oldNames) { - $scope.dataCount = newNames.length; - }); - - expect($scope.dataCount).toEqual(4); - $scope.$digest(); - - //still at 4 ... no changes - expect($scope.dataCount).toEqual(4); - - $scope.names.pop(); - $scope.$digest(); - - //now there's been a change - expect($scope.dataCount).toEqual(3); - * ``` - * - * - * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The - * expression value should evaluate to an object or an array which is observed on each - * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the - * collection will trigger a call to the `listener`. - * - * @param {function(newCollection, oldCollection, scope)} listener a callback function called - * when a change is detected. - * - The `newCollection` object is the newly modified data obtained from the `obj` expression - * - The `oldCollection` object is a copy of the former collection data. - * Due to performance considerations, the`oldCollection` value is computed only if the - * `listener` function declares two or more arguments. - * - The `scope` argument refers to the current scope. - * - * @returns {function()} Returns a de-registration function for this listener. When the - * de-registration function is executed, the internal watch operation is terminated. - */ - $watchCollection: function(obj, listener) { - $watchCollectionInterceptor.$stateful = true; - - var self = this; - // the current value, updated on each dirty-check run - var newValue; - // a shallow copy of the newValue from the last dirty-check run, - // updated to match newValue during dirty-check run - var oldValue; - // a shallow copy of the newValue from when the last change happened - var veryOldValue; - // only track veryOldValue if the listener is asking for it - var trackVeryOldValue = (listener.length > 1); - var changeDetected = 0; - var changeDetector = $parse(obj, $watchCollectionInterceptor); - var internalArray = []; - var internalObject = {}; - var initRun = true; - var oldLength = 0; - - function $watchCollectionInterceptor(_value) { - newValue = _value; - var newLength, key, bothNaN, newItem, oldItem; - - // If the new value is undefined, then return undefined as the watch may be a one-time watch - if (isUndefined(newValue)) return; - - if (!isObject(newValue)) { // if primitive - if (oldValue !== newValue) { - oldValue = newValue; - changeDetected++; - } - } else if (isArrayLike(newValue)) { - if (oldValue !== internalArray) { - // we are transitioning from something which was not an array into array. - oldValue = internalArray; - oldLength = oldValue.length = 0; - changeDetected++; - } - - newLength = newValue.length; - - if (oldLength !== newLength) { - // if lengths do not match we need to trigger change notification - changeDetected++; - oldValue.length = oldLength = newLength; - } - // copy the items to oldValue and look for changes. - for (var i = 0; i < newLength; i++) { - oldItem = oldValue[i]; - newItem = newValue[i]; - - bothNaN = (oldItem !== oldItem) && (newItem !== newItem); - if (!bothNaN && (oldItem !== newItem)) { - changeDetected++; - oldValue[i] = newItem; - } - } - } else { - if (oldValue !== internalObject) { - // we are transitioning from something which was not an object into object. - oldValue = internalObject = {}; - oldLength = 0; - changeDetected++; - } - // copy the items to oldValue and look for changes. - newLength = 0; - for (key in newValue) { - if (newValue.hasOwnProperty(key)) { - newLength++; - newItem = newValue[key]; - oldItem = oldValue[key]; - - if (key in oldValue) { - bothNaN = (oldItem !== oldItem) && (newItem !== newItem); - if (!bothNaN && (oldItem !== newItem)) { - changeDetected++; - oldValue[key] = newItem; - } - } else { - oldLength++; - oldValue[key] = newItem; - changeDetected++; - } - } - } - if (oldLength > newLength) { - // we used to have more keys, need to find them and destroy them. - changeDetected++; - for (key in oldValue) { - if (!newValue.hasOwnProperty(key)) { - oldLength--; - delete oldValue[key]; - } - } - } - } - return changeDetected; - } - - function $watchCollectionAction() { - if (initRun) { - initRun = false; - listener(newValue, newValue, self); - } else { - listener(newValue, veryOldValue, self); - } - - // make a copy for the next time a collection is changed - if (trackVeryOldValue) { - if (!isObject(newValue)) { - //primitive - veryOldValue = newValue; - } else if (isArrayLike(newValue)) { - veryOldValue = new Array(newValue.length); - for (var i = 0; i < newValue.length; i++) { - veryOldValue[i] = newValue[i]; - } - } else { // if object - veryOldValue = {}; - for (var key in newValue) { - if (hasOwnProperty.call(newValue, key)) { - veryOldValue[key] = newValue[key]; - } - } - } - } - } - - return this.$watch(changeDetector, $watchCollectionAction); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$digest - * @kind function - * - * @description - * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and - * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change - * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} - * until no more listeners are firing. This means that it is possible to get into an infinite - * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of - * iterations exceeds 10. - * - * Usually, you don't call `$digest()` directly in - * {@link ng.directive:ngController controllers} or in - * {@link ng.$compileProvider#directive directives}. - * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within - * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`. - * - * If you want to be notified whenever `$digest()` is called, - * you can register a `watchExpression` function with - * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`. - * - * In unit tests, you may need to call `$digest()` to simulate the scope life cycle. - * - * # Example - * ```js - var scope = ...; - scope.name = 'misko'; - scope.counter = 0; - - expect(scope.counter).toEqual(0); - scope.$watch('name', function(newValue, oldValue) { - scope.counter = scope.counter + 1; - }); - expect(scope.counter).toEqual(0); - - scope.$digest(); - // the listener is always called during the first $digest loop after it was registered - expect(scope.counter).toEqual(1); - - scope.$digest(); - // but now it will not be called unless the value changes - expect(scope.counter).toEqual(1); - - scope.name = 'adam'; - scope.$digest(); - expect(scope.counter).toEqual(2); - * ``` - * - */ - $digest: function() { - var watch, value, last, - watchers, - length, - dirty, ttl = TTL, - next, current, target = this, - watchLog = [], - logIdx, logMsg, asyncTask; - - beginPhase('$digest'); - // Check for changes to browser url that happened in sync before the call to $digest - $browser.$$checkUrlChange(); - - if (this === $rootScope && applyAsyncId !== null) { - // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then - // cancel the scheduled $apply and flush the queue of expressions to be evaluated. - $browser.defer.cancel(applyAsyncId); - flushApplyAsync(); - } - - lastDirtyWatch = null; - - do { // "while dirty" loop - dirty = false; - current = target; - - while (asyncQueue.length) { - try { - asyncTask = asyncQueue.shift(); - asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals); - } catch (e) { - $exceptionHandler(e); - } - lastDirtyWatch = null; - } - - traverseScopesLoop: - do { // "traverse the scopes" loop - if ((watchers = current.$$watchers)) { - // process our watches - length = watchers.length; - while (length--) { - try { - watch = watchers[length]; - // Most common watches are on primitives, in which case we can short - // circuit it with === operator, only when === fails do we use .equals - if (watch) { - if ((value = watch.get(current)) !== (last = watch.last) && - !(watch.eq - ? equals(value, last) - : (typeof value === 'number' && typeof last === 'number' - && isNaN(value) && isNaN(last)))) { - dirty = true; - lastDirtyWatch = watch; - watch.last = watch.eq ? copy(value, null) : value; - watch.fn(value, ((last === initWatchVal) ? value : last), current); - if (ttl < 5) { - logIdx = 4 - ttl; - if (!watchLog[logIdx]) watchLog[logIdx] = []; - watchLog[logIdx].push({ - msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp, - newVal: value, - oldVal: last - }); - } - } else if (watch === lastDirtyWatch) { - // If the most recently dirty watcher is now clean, short circuit since the remaining watchers - // have already been tested. - dirty = false; - break traverseScopesLoop; - } - } - } catch (e) { - $exceptionHandler(e); - } - } - } - - // Insanity Warning: scope depth-first traversal - // yes, this code is a bit crazy, but it works and we have tests to prove it! - // this piece should be kept in sync with the traversal in $broadcast - if (!(next = (current.$$childHead || - (current !== target && current.$$nextSibling)))) { - while (current !== target && !(next = current.$$nextSibling)) { - current = current.$parent; - } - } - } while ((current = next)); - - // `break traverseScopesLoop;` takes us to here - - if ((dirty || asyncQueue.length) && !(ttl--)) { - clearPhase(); - throw $rootScopeMinErr('infdig', - '{0} $digest() iterations reached. Aborting!\n' + - 'Watchers fired in the last 5 iterations: {1}', - TTL, watchLog); - } - - } while (dirty || asyncQueue.length); - - clearPhase(); - - while (postDigestQueue.length) { - try { - postDigestQueue.shift()(); - } catch (e) { - $exceptionHandler(e); - } - } - }, - - - /** - * @ngdoc event - * @name $rootScope.Scope#$destroy - * @eventType broadcast on scope being destroyed - * - * @description - * Broadcasted when a scope and its children are being destroyed. - * - * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to - * clean up DOM bindings before an element is removed from the DOM. - */ - - /** - * @ngdoc method - * @name $rootScope.Scope#$destroy - * @kind function - * - * @description - * Removes the current scope (and all of its children) from the parent scope. Removal implies - * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer - * propagate to the current scope and its children. Removal also implies that the current - * scope is eligible for garbage collection. - * - * The `$destroy()` is usually used by directives such as - * {@link ng.directive:ngRepeat ngRepeat} for managing the - * unrolling of the loop. - * - * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope. - * Application code can register a `$destroy` event handler that will give it a chance to - * perform any necessary cleanup. - * - * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to - * clean up DOM bindings before an element is removed from the DOM. - */ - $destroy: function() { - // we can't destroy the root scope or a scope that has been already destroyed - if (this.$$destroyed) return; - var parent = this.$parent; - - this.$broadcast('$destroy'); - this.$$destroyed = true; - if (this === $rootScope) return; - - for (var eventName in this.$$listenerCount) { - decrementListenerCount(this, this.$$listenerCount[eventName], eventName); - } - - // sever all the references to parent scopes (after this cleanup, the current scope should - // not be retained by any of our references and should be eligible for garbage collection) - if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; - if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; - if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; - if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; - - // Disable listeners, watchers and apply/digest methods - this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; - this.$on = this.$watch = this.$watchGroup = function() { return noop; }; - this.$$listeners = {}; - - // All of the code below is bogus code that works around V8's memory leak via optimized code - // and inline caches. - // - // see: - // - https://code.google.com/p/v8/issues/detail?id=2073#c26 - // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909 - // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 - - this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = - this.$$childTail = this.$root = this.$$watchers = null; - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$eval - * @kind function - * - * @description - * Executes the `expression` on the current scope and returns the result. Any exceptions in - * the expression are propagated (uncaught). This is useful when evaluating Angular - * expressions. - * - * # Example - * ```js - var scope = ng.$rootScope.Scope(); - scope.a = 1; - scope.b = 2; - - expect(scope.$eval('a+b')).toEqual(3); - expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3); - * ``` - * - * @param {(string|function())=} expression An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with the current `scope` parameter. - * - * @param {(object)=} locals Local variables object, useful for overriding values in scope. - * @returns {*} The result of evaluating the expression. - */ - $eval: function(expr, locals) { - return $parse(expr)(this, locals); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$evalAsync - * @kind function - * - * @description - * Executes the expression on the current scope at a later point in time. - * - * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only - * that: - * - * - it will execute after the function that scheduled the evaluation (preferably before DOM - * rendering). - * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after - * `expression` execution. - * - * Any exceptions from the execution of the expression are forwarded to the - * {@link ng.$exceptionHandler $exceptionHandler} service. - * - * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle - * will be scheduled. However, it is encouraged to always call code that changes the model - * from within an `$apply` call. That includes code evaluated via `$evalAsync`. - * - * @param {(string|function())=} expression An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with the current `scope` parameter. - * - * @param {(object)=} locals Local variables object, useful for overriding values in scope. - */ - $evalAsync: function(expr, locals) { - // if we are outside of an $digest loop and this is the first time we are scheduling async - // task also schedule async auto-flush - if (!$rootScope.$$phase && !asyncQueue.length) { - $browser.defer(function() { - if (asyncQueue.length) { - $rootScope.$digest(); - } - }); - } - - asyncQueue.push({scope: this, expression: expr, locals: locals}); - }, - - $$postDigest: function(fn) { - postDigestQueue.push(fn); - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$apply - * @kind function - * - * @description - * `$apply()` is used to execute an expression in angular from outside of the angular - * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries). - * Because we are calling into the angular framework we need to perform proper scope life - * cycle of {@link ng.$exceptionHandler exception handling}, - * {@link ng.$rootScope.Scope#$digest executing watches}. - * - * ## Life cycle - * - * # Pseudo-Code of `$apply()` - * ```js - function $apply(expr) { - try { - return $eval(expr); - } catch (e) { - $exceptionHandler(e); - } finally { - $root.$digest(); - } - } - * ``` - * - * - * Scope's `$apply()` method transitions through the following stages: - * - * 1. The {@link guide/expression expression} is executed using the - * {@link ng.$rootScope.Scope#$eval $eval()} method. - * 2. Any exceptions from the execution of the expression are forwarded to the - * {@link ng.$exceptionHandler $exceptionHandler} service. - * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the - * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. - * - * - * @param {(string|function())=} exp An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with current `scope` parameter. - * - * @returns {*} The result of evaluating the expression. - */ - $apply: function(expr) { - try { - beginPhase('$apply'); - return this.$eval(expr); - } catch (e) { - $exceptionHandler(e); - } finally { - clearPhase(); - try { - $rootScope.$digest(); - } catch (e) { - $exceptionHandler(e); - throw e; - } - } - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$applyAsync - * @kind function - * - * @description - * Schedule the invocation of $apply to occur at a later time. The actual time difference - * varies across browsers, but is typically around ~10 milliseconds. - * - * This can be used to queue up multiple expressions which need to be evaluated in the same - * digest. - * - * @param {(string|function())=} exp An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with current `scope` parameter. - */ - $applyAsync: function(expr) { - var scope = this; - expr && applyAsyncQueue.push($applyAsyncExpression); - scheduleApplyAsync(); - - function $applyAsyncExpression() { - scope.$eval(expr); - } - }, - - /** - * @ngdoc method - * @name $rootScope.Scope#$on - * @kind function - * - * @description - * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for - * discussion of event life cycle. - * - * The event listener function format is: `function(event, args...)`. The `event` object - * passed into the listener has the following attributes: - * - * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or - * `$broadcast`-ed. - * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the - * event propagates through the scope hierarchy, this property is set to null. - * - `name` - `{string}`: name of the event. - * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel - * further event propagation (available only for events that were `$emit`-ed). - * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag - * to true. - * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. - * - * @param {string} name Event name to listen on. - * @param {function(event, ...args)} listener Function to call when the event is emitted. - * @returns {function()} Returns a deregistration function for this listener. - */ - $on: function(name, listener) { - var namedListeners = this.$$listeners[name]; - if (!namedListeners) { - this.$$listeners[name] = namedListeners = []; - } - namedListeners.push(listener); - - var current = this; - do { - if (!current.$$listenerCount[name]) { - current.$$listenerCount[name] = 0; - } - current.$$listenerCount[name]++; - } while ((current = current.$parent)); - - var self = this; - return function() { - var indexOfListener = namedListeners.indexOf(listener); - if (indexOfListener !== -1) { - namedListeners[indexOfListener] = null; - decrementListenerCount(self, 1, name); - } - }; - }, - - - /** - * @ngdoc method - * @name $rootScope.Scope#$emit - * @kind function - * - * @description - * Dispatches an event `name` upwards through the scope hierarchy notifying the - * registered {@link ng.$rootScope.Scope#$on} listeners. - * - * The event life cycle starts at the scope on which `$emit` was called. All - * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get - * notified. Afterwards, the event traverses upwards toward the root scope and calls all - * registered listeners along the way. The event will stop propagating if one of the listeners - * cancels it. - * - * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed - * onto the {@link ng.$exceptionHandler $exceptionHandler} service. - * - * @param {string} name Event name to emit. - * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. - * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}). - */ - $emit: function(name, args) { - var empty = [], - namedListeners, - scope = this, - stopPropagation = false, - event = { - name: name, - targetScope: scope, - stopPropagation: function() {stopPropagation = true;}, - preventDefault: function() { - event.defaultPrevented = true; - }, - defaultPrevented: false - }, - listenerArgs = concat([event], arguments, 1), - i, length; - - do { - namedListeners = scope.$$listeners[name] || empty; - event.currentScope = scope; - for (i = 0, length = namedListeners.length; i < length; i++) { - - // if listeners were deregistered, defragment the array - if (!namedListeners[i]) { - namedListeners.splice(i, 1); - i--; - length--; - continue; - } - try { - //allow all listeners attached to the current scope to run - namedListeners[i].apply(null, listenerArgs); - } catch (e) { - $exceptionHandler(e); - } - } - //if any listener on the current scope stops propagation, prevent bubbling - if (stopPropagation) { - event.currentScope = null; - return event; - } - //traverse upwards - scope = scope.$parent; - } while (scope); - - event.currentScope = null; - - return event; - }, - - - /** - * @ngdoc method - * @name $rootScope.Scope#$broadcast - * @kind function - * - * @description - * Dispatches an event `name` downwards to all child scopes (and their children) notifying the - * registered {@link ng.$rootScope.Scope#$on} listeners. - * - * The event life cycle starts at the scope on which `$broadcast` was called. All - * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get - * notified. Afterwards, the event propagates to all direct and indirect scopes of the current - * scope and calls all registered listeners along the way. The event cannot be canceled. - * - * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed - * onto the {@link ng.$exceptionHandler $exceptionHandler} service. - * - * @param {string} name Event name to broadcast. - * @param {...*} args Optional one or more arguments which will be passed onto the event listeners. - * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} - */ - $broadcast: function(name, args) { - var target = this, - current = target, - next = target, - event = { - name: name, - targetScope: target, - preventDefault: function() { - event.defaultPrevented = true; - }, - defaultPrevented: false - }; - - if (!target.$$listenerCount[name]) return event; - - var listenerArgs = concat([event], arguments, 1), - listeners, i, length; - - //down while you can, then up and next sibling or up and next sibling until back at root - while ((current = next)) { - event.currentScope = current; - listeners = current.$$listeners[name] || []; - for (i = 0, length = listeners.length; i < length; i++) { - // if listeners were deregistered, defragment the array - if (!listeners[i]) { - listeners.splice(i, 1); - i--; - length--; - continue; - } - - try { - listeners[i].apply(null, listenerArgs); - } catch (e) { - $exceptionHandler(e); - } - } - - // Insanity Warning: scope depth-first traversal - // yes, this code is a bit crazy, but it works and we have tests to prove it! - // this piece should be kept in sync with the traversal in $digest - // (though it differs due to having the extra check for $$listenerCount) - if (!(next = ((current.$$listenerCount[name] && current.$$childHead) || - (current !== target && current.$$nextSibling)))) { - while (current !== target && !(next = current.$$nextSibling)) { - current = current.$parent; - } - } - } - - event.currentScope = null; - return event; - } - }; - - var $rootScope = new Scope(); - - //The internal queues. Expose them on the $rootScope for debugging/testing purposes. - var asyncQueue = $rootScope.$$asyncQueue = []; - var postDigestQueue = $rootScope.$$postDigestQueue = []; - var applyAsyncQueue = $rootScope.$$applyAsyncQueue = []; - - return $rootScope; - - - function beginPhase(phase) { - if ($rootScope.$$phase) { - throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); - } - - $rootScope.$$phase = phase; - } - - function clearPhase() { - $rootScope.$$phase = null; - } - - - function decrementListenerCount(current, count, name) { - do { - current.$$listenerCount[name] -= count; - - if (current.$$listenerCount[name] === 0) { - delete current.$$listenerCount[name]; - } - } while ((current = current.$parent)); - } - - /** - * function used as an initial value for watchers. - * because it's unique we can easily tell it apart from other values - */ - function initWatchVal() {} - - function flushApplyAsync() { - while (applyAsyncQueue.length) { - try { - applyAsyncQueue.shift()(); - } catch (e) { - $exceptionHandler(e); - } - } - applyAsyncId = null; - } - - function scheduleApplyAsync() { - if (applyAsyncId === null) { - applyAsyncId = $browser.defer(function() { - $rootScope.$apply(flushApplyAsync); - }); - } - } - }]; -} - -/** - * @description - * Private service to sanitize uris for links and images. Used by $compile and $sanitize. - */ -function $$SanitizeUriProvider() { - var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/, - imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/; - - /** - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during a[href] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to a[href] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.aHrefSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - aHrefSanitizationWhitelist = regexp; - return this; - } - return aHrefSanitizationWhitelist; - }; - - - /** - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during img[src] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to img[src] via data-binding is first normalized and turned into - * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist` - * regular expression. If a match is found, the original url is written into the dom. Otherwise, - * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.imgSrcSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - imgSrcSanitizationWhitelist = regexp; - return this; - } - return imgSrcSanitizationWhitelist; - }; - - this.$get = function() { - return function sanitizeUri(uri, isImage) { - var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist; - var normalizedVal; - normalizedVal = urlResolve(uri).href; - if (normalizedVal !== '' && !normalizedVal.match(regex)) { - return 'unsafe:' + normalizedVal; - } - return uri; - }; - }; -} - -var $sceMinErr = minErr('$sce'); - -var SCE_CONTEXTS = { - HTML: 'html', - CSS: 'css', - URL: 'url', - // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a - // url. (e.g. ng-include, script src, templateUrl) - RESOURCE_URL: 'resourceUrl', - JS: 'js' -}; - -// Helper functions follow. - -function adjustMatcher(matcher) { - if (matcher === 'self') { - return matcher; - } else if (isString(matcher)) { - // Strings match exactly except for 2 wildcards - '*' and '**'. - // '*' matches any character except those from the set ':/.?&'. - // '**' matches any character (like .* in a RegExp). - // More than 2 *'s raises an error as it's ill defined. - if (matcher.indexOf('***') > -1) { - throw $sceMinErr('iwcard', - 'Illegal sequence *** in string matcher. String: {0}', matcher); - } - matcher = escapeForRegexp(matcher). - replace('\\*\\*', '.*'). - replace('\\*', '[^:/.?&;]*'); - return new RegExp('^' + matcher + '$'); - } else if (isRegExp(matcher)) { - // The only other type of matcher allowed is a Regexp. - // Match entire URL / disallow partial matches. - // Flags are reset (i.e. no global, ignoreCase or multiline) - return new RegExp('^' + matcher.source + '$'); - } else { - throw $sceMinErr('imatcher', - 'Matchers may only be "self", string patterns or RegExp objects'); - } -} - - -function adjustMatchers(matchers) { - var adjustedMatchers = []; - if (isDefined(matchers)) { - forEach(matchers, function(matcher) { - adjustedMatchers.push(adjustMatcher(matcher)); - }); - } - return adjustedMatchers; -} - - -/** - * @ngdoc service - * @name $sceDelegate - * @kind function - * - * @description - * - * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict - * Contextual Escaping (SCE)} services to AngularJS. - * - * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of - * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is - * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to - * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things - * work because `$sce` delegates to `$sceDelegate` for these operations. - * - * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service. - * - * The default instance of `$sceDelegate` should work out of the box with little pain. While you - * can override it completely to change the behavior of `$sce`, the common case would - * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting - * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as - * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist - * $sceDelegateProvider.resourceUrlWhitelist} and {@link - * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} - */ - -/** - * @ngdoc provider - * @name $sceDelegateProvider - * @description - * - * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate - * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure - * that the URLs used for sourcing Angular templates are safe. Refer {@link - * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and - * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist} - * - * For the general details about this service in Angular, read the main page for {@link ng.$sce - * Strict Contextual Escaping (SCE)}. - * - * **Example**: Consider the following case. - * - * - your app is hosted at url `http://myapp.example.com/` - * - but some of your templates are hosted on other domains you control such as - * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc. - * - and you have an open redirect at `http://myapp.example.com/clickThru?...`. - * - * Here is what a secure configuration for this scenario might look like: - * - * ``` - * angular.module('myApp', []).config(function($sceDelegateProvider) { - * $sceDelegateProvider.resourceUrlWhitelist([ - * // Allow same origin resource loads. - * 'self', - * // Allow loading from our assets domain. Notice the difference between * and **. - * 'http://srv*.assets.example.com/**' - * ]); - * - * // The blacklist overrides the whitelist so the open redirect here is blocked. - * $sceDelegateProvider.resourceUrlBlacklist([ - * 'http://myapp.example.com/clickThru**' - * ]); - * }); - * ``` - */ - -function $SceDelegateProvider() { - this.SCE_CONTEXTS = SCE_CONTEXTS; - - // Resource URLs can also be trusted by policy. - var resourceUrlWhitelist = ['self'], - resourceUrlBlacklist = []; - - /** - * @ngdoc method - * @name $sceDelegateProvider#resourceUrlWhitelist - * @kind function - * - * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value - * provided. This must be an array or null. A snapshot of this array is used so further - * changes to the array are ignored. - * - * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items - * allowed in this array. - * - * Note: **an empty whitelist array will block all URLs**! - * - * @return {Array} the currently set whitelist array. - * - * The **default value** when no whitelist has been explicitly set is `['self']` allowing only - * same origin resource requests. - * - * @description - * Sets/Gets the whitelist of trusted resource URLs. - */ - this.resourceUrlWhitelist = function(value) { - if (arguments.length) { - resourceUrlWhitelist = adjustMatchers(value); - } - return resourceUrlWhitelist; - }; - - /** - * @ngdoc method - * @name $sceDelegateProvider#resourceUrlBlacklist - * @kind function - * - * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value - * provided. This must be an array or null. A snapshot of this array is used so further - * changes to the array are ignored. - * - * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items - * allowed in this array. - * - * The typical usage for the blacklist is to **block - * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as - * these would otherwise be trusted but actually return content from the redirected domain. - * - * Finally, **the blacklist overrides the whitelist** and has the final say. - * - * @return {Array} the currently set blacklist array. - * - * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there - * is no blacklist.) - * - * @description - * Sets/Gets the blacklist of trusted resource URLs. - */ - - this.resourceUrlBlacklist = function(value) { - if (arguments.length) { - resourceUrlBlacklist = adjustMatchers(value); - } - return resourceUrlBlacklist; - }; - - this.$get = ['$injector', function($injector) { - - var htmlSanitizer = function htmlSanitizer(html) { - throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); - }; - - if ($injector.has('$sanitize')) { - htmlSanitizer = $injector.get('$sanitize'); - } - - - function matchUrl(matcher, parsedUrl) { - if (matcher === 'self') { - return urlIsSameOrigin(parsedUrl); - } else { - // definitely a regex. See adjustMatchers() - return !!matcher.exec(parsedUrl.href); - } - } - - function isResourceUrlAllowedByPolicy(url) { - var parsedUrl = urlResolve(url.toString()); - var i, n, allowed = false; - // Ensure that at least one item from the whitelist allows this url. - for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) { - if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) { - allowed = true; - break; - } - } - if (allowed) { - // Ensure that no item from the blacklist blocked this url. - for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) { - if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) { - allowed = false; - break; - } - } - } - return allowed; - } - - function generateHolderType(Base) { - var holderType = function TrustedValueHolderType(trustedValue) { - this.$$unwrapTrustedValue = function() { - return trustedValue; - }; - }; - if (Base) { - holderType.prototype = new Base(); - } - holderType.prototype.valueOf = function sceValueOf() { - return this.$$unwrapTrustedValue(); - }; - holderType.prototype.toString = function sceToString() { - return this.$$unwrapTrustedValue().toString(); - }; - return holderType; - } - - var trustedValueHolderBase = generateHolderType(), - byType = {}; - - byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase); - byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]); - - /** - * @ngdoc method - * @name $sceDelegate#trustAs - * - * @description - * Returns an object that is trusted by angular for use in specified strict - * contextual escaping contexts (such as ng-bind-html, ng-include, any src - * attribute interpolation, any dom event binding attribute interpolation - * such as for onclick, etc.) that uses the provided value. - * See {@link ng.$sce $sce} for enabling strict contextual escaping. - * - * @param {string} type The kind of context in which this value is safe for use. e.g. url, - * resourceUrl, html, js and css. - * @param {*} value The value that that should be considered trusted/safe. - * @returns {*} A value that can be used to stand in for the provided `value` in places - * where Angular expects a $sce.trustAs() return value. - */ - function trustAs(type, trustedValue) { - var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null); - if (!Constructor) { - throw $sceMinErr('icontext', - 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}', - type, trustedValue); - } - if (trustedValue === null || trustedValue === undefined || trustedValue === '') { - return trustedValue; - } - // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting - // mutable objects, we ensure here that the value passed in is actually a string. - if (typeof trustedValue !== 'string') { - throw $sceMinErr('itype', - 'Attempted to trust a non-string value in a content requiring a string: Context: {0}', - type); - } - return new Constructor(trustedValue); - } - - /** - * @ngdoc method - * @name $sceDelegate#valueOf - * - * @description - * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link - * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. - * - * If the passed parameter is not a value that had been returned by {@link - * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is. - * - * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} - * call or anything else. - * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns - * `value` unchanged. - */ - function valueOf(maybeTrusted) { - if (maybeTrusted instanceof trustedValueHolderBase) { - return maybeTrusted.$$unwrapTrustedValue(); - } else { - return maybeTrusted; - } - } - - /** - * @ngdoc method - * @name $sceDelegate#getTrusted - * - * @description - * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and - * returns the originally supplied value if the queried context type is a supertype of the - * created type. If this condition isn't satisfied, throws an exception. - * - * @param {string} type The kind of context in which this value is to be used. - * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`} call. - * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs - * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception. - */ - function getTrusted(type, maybeTrusted) { - if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') { - return maybeTrusted; - } - var constructor = (byType.hasOwnProperty(type) ? byType[type] : null); - if (constructor && maybeTrusted instanceof constructor) { - return maybeTrusted.$$unwrapTrustedValue(); - } - // If we get here, then we may only take one of two actions. - // 1. sanitize the value for the requested type, or - // 2. throw an exception. - if (type === SCE_CONTEXTS.RESOURCE_URL) { - if (isResourceUrlAllowedByPolicy(maybeTrusted)) { - return maybeTrusted; - } else { - throw $sceMinErr('insecurl', - 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}', - maybeTrusted.toString()); - } - } else if (type === SCE_CONTEXTS.HTML) { - return htmlSanitizer(maybeTrusted); - } - throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.'); - } - - return { trustAs: trustAs, - getTrusted: getTrusted, - valueOf: valueOf }; - }]; -} - - -/** - * @ngdoc provider - * @name $sceProvider - * @description - * - * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service. - * - enable/disable Strict Contextual Escaping (SCE) in a module - * - override the default implementation with a custom delegate - * - * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}. - */ - -/* jshint maxlen: false*/ - -/** - * @ngdoc service - * @name $sce - * @kind function - * - * @description - * - * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS. - * - * # Strict Contextual Escaping - * - * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain - * contexts to result in a value that is marked as safe to use for that context. One example of - * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer - * to these contexts as privileged or SCE contexts. - * - * As of version 1.2, Angular ships with SCE enabled by default. - * - * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow - * one to execute arbitrary javascript by the use of the expression() syntax. Refer - * to learn more about them. - * You can ensure your document is in standards mode and not quirks mode by adding `` - * to the top of your HTML document. - * - * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for - * security vulnerabilities such as XSS, clickjacking, etc. a lot easier. - * - * Here's an example of a binding in a privileged context: - * - * ``` - * - *
    - * ``` - * - * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE - * disabled, this application allows the user to render arbitrary HTML into the DIV. - * In a more realistic example, one may be rendering user comments, blog articles, etc. via - * bindings. (HTML is just one example of a context where rendering user controlled input creates - * security vulnerabilities.) - * - * For the case of HTML, you might use a library, either on the client side, or on the server side, - * to sanitize unsafe HTML before binding to the value and rendering it in the document. - * - * How would you ensure that every place that used these types of bindings was bound to a value that - * was sanitized by your library (or returned as safe for rendering by your server?) How can you - * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some - * properties/fields and forgot to update the binding to the sanitized value? - * - * To be secure by default, you want to ensure that any such bindings are disallowed unless you can - * determine that something explicitly says it's safe to use a value for binding in that - * context. You can then audit your code (a simple grep would do) to ensure that this is only done - * for those values that you can easily tell are safe - because they were received from your server, - * sanitized by your library, etc. You can organize your codebase to help with this - perhaps - * allowing only the files in a specific directory to do this. Ensuring that the internal API - * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. - * - * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs} - * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to - * obtain values that will be accepted by SCE / privileged contexts. - * - * - * ## How does it work? - * - * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted - * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link - * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the - * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. - * - * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link - * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly - * simplified): - * - * ``` - * var ngBindHtmlDirective = ['$sce', function($sce) { - * return function(scope, element, attr) { - * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) { - * element.html(value || ''); - * }); - * }; - * }]; - * ``` - * - * ## Impact on loading templates - * - * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as - * `templateUrl`'s specified by {@link guide/directive directives}. - * - * By default, Angular only loads templates from the same domain and protocol as the application - * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl - * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or - * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist - * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value. - * - * *Please note*: - * The browser's - * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest) - * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) - * policy apply in addition to this and may further restrict whether the template is successfully - * loaded. This means that without the right CORS policy, loading templates from a different domain - * won't work on all browsers. Also, loading templates from `file://` URL does not work on some - * browsers. - * - * ## This feels like too much overhead - * - * It's important to remember that SCE only applies to interpolation expressions. - * - * If your expressions are constant literals, they're automatically trusted and you don't need to - * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g. - * `
    `) just works. - * - * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them - * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here. - * - * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load - * templates in `ng-include` from your application's domain without having to even know about SCE. - * It blocks loading templates from other domains or loading templates over http from an https - * served document. You can change these by setting your own custom {@link - * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link - * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs. - * - * This significantly reduces the overhead. It is far easier to pay the small overhead and have an - * application that's secure and can be audited to verify that with much more ease than bolting - * security onto an application later. - * - * - * ## What trusted context types are supported? - * - * | Context | Notes | - * |---------------------|----------------| - * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. | - * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. | - * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`
    Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. | - * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. | - * - * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist}
    - * - * Each element in these arrays must be one of the following: - * - * - **'self'** - * - The special **string**, `'self'`, can be used to match against all URLs of the **same - * domain** as the application document using the **same protocol**. - * - **String** (except the special value `'self'`) - * - The string is matched against the full *normalized / absolute URL* of the resource - * being tested (substring matches are not good enough.) - * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters - * match themselves. - * - `*`: matches zero or more occurrences of any character other than one of the following 6 - * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use - * in a whitelist. - * - `**`: matches zero or more occurrences of *any* character. As such, it's not - * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g. - * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might - * not have been the intention.) Its usage at the very end of the path is ok. (e.g. - * http://foo.example.com/templates/**). - * - **RegExp** (*see caveat below*) - * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax - * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to - * accidentally introduce a bug when one updates a complex expression (imho, all regexes should - * have good test coverage.). For instance, the use of `.` in the regex is correct only in a - * small number of cases. A `.` character in the regex used when matching the scheme or a - * subdomain could be matched against a `:` or literal `.` that was likely not intended. It - * is highly recommended to use the string patterns and only fall back to regular expressions - * if they as a last resort. - * - The regular expression must be an instance of RegExp (i.e. not a string.) It is - * matched against the **entire** *normalized / absolute URL* of the resource being tested - * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags - * present on the RegExp (such as multiline, global, ignoreCase) are ignored. - * - If you are generating your JavaScript from some other templating engine (not - * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)), - * remember to escape your regular expression (and be aware that you might need more than - * one level of escaping depending on your templating engine and the way you interpolated - * the value.) Do make use of your platform's escaping mechanism as it might be good - * enough before coding your own. e.g. Ruby has - * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape) - * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape). - * Javascript lacks a similar built in function for escaping. Take a look at Google - * Closure library's [goog.string.regExpEscape(s)]( - * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962). - * - * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example. - * - * ## Show me an example using SCE. - * - * - * - *
    - *

    - * User comments
    - * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when - * $sanitize is available. If $sanitize isn't available, this results in an error instead of an - * exploit. - *
    - *
    - * {{userComment.name}}: - * - *
    - *
    - *
    - *
    - *
    - * - * - * angular.module('mySceApp', ['ngSanitize']) - * .controller('AppController', ['$http', '$templateCache', '$sce', - * function($http, $templateCache, $sce) { - * var self = this; - * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) { - * self.userComments = userComments; - * }); - * self.explicitlyTrustedHtml = $sce.trustAsHtml( - * 'Hover over this text.'); - * }]); - * - * - * - * [ - * { "name": "Alice", - * "htmlComment": - * "Is anyone reading this?" - * }, - * { "name": "Bob", - * "htmlComment": "Yes! Am I the only other one?" - * } - * ] - * - * - * - * describe('SCE doc demo', function() { - * it('should sanitize untrusted values', function() { - * expect(element.all(by.css('.htmlComment')).first().getInnerHtml()) - * .toBe('Is anyone reading this?'); - * }); - * - * it('should NOT sanitize explicitly trusted values', function() { - * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe( - * 'Hover over this text.'); - * }); - * }); - * - *
    - * - * - * - * ## Can I disable SCE completely? - * - * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits - * for little coding overhead. It will be much harder to take an SCE disabled application and - * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE - * for cases where you have a lot of existing code that was written before SCE was introduced and - * you're migrating them a module at a time. - * - * That said, here's how you can completely disable SCE: - * - * ``` - * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) { - * // Completely disable SCE. For demonstration purposes only! - * // Do not use in new projects. - * $sceProvider.enabled(false); - * }); - * ``` - * - */ -/* jshint maxlen: 100 */ - -function $SceProvider() { - var enabled = true; - - /** - * @ngdoc method - * @name $sceProvider#enabled - * @kind function - * - * @param {boolean=} value If provided, then enables/disables SCE. - * @return {boolean} true if SCE is enabled, false otherwise. - * - * @description - * Enables/disables SCE and returns the current value. - */ - this.enabled = function(value) { - if (arguments.length) { - enabled = !!value; - } - return enabled; - }; - - - /* Design notes on the default implementation for SCE. - * - * The API contract for the SCE delegate - * ------------------------------------- - * The SCE delegate object must provide the following 3 methods: - * - * - trustAs(contextEnum, value) - * This method is used to tell the SCE service that the provided value is OK to use in the - * contexts specified by contextEnum. It must return an object that will be accepted by - * getTrusted() for a compatible contextEnum and return this value. - * - * - valueOf(value) - * For values that were not produced by trustAs(), return them as is. For values that were - * produced by trustAs(), return the corresponding input value to trustAs. Basically, if - * trustAs is wrapping the given values into some type, this operation unwraps it when given - * such a value. - * - * - getTrusted(contextEnum, value) - * This function should return the a value that is safe to use in the context specified by - * contextEnum or throw and exception otherwise. - * - * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be - * opaque or wrapped in some holder object. That happens to be an implementation detail. For - * instance, an implementation could maintain a registry of all trusted objects by context. In - * such a case, trustAs() would return the same object that was passed in. getTrusted() would - * return the same object passed in if it was found in the registry under a compatible context or - * throw an exception otherwise. An implementation might only wrap values some of the time based - * on some criteria. getTrusted() might return a value and not throw an exception for special - * constants or objects even if not wrapped. All such implementations fulfill this contract. - * - * - * A note on the inheritance model for SCE contexts - * ------------------------------------------------ - * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This - * is purely an implementation details. - * - * The contract is simply this: - * - * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value) - * will also succeed. - * - * Inheritance happens to capture this in a natural way. In some future, we - * may not use inheritance anymore. That is OK because no code outside of - * sce.js and sceSpecs.js would need to be aware of this detail. - */ - - this.$get = ['$parse', '$sceDelegate', function( - $parse, $sceDelegate) { - // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow - // the "expression(javascript expression)" syntax which is insecure. - if (enabled && msie < 8) { - throw $sceMinErr('iequirks', - 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' + - 'mode. You can fix this by adding the text to the top of your HTML ' + - 'document. See http://docs.angularjs.org/api/ng.$sce for more information.'); - } - - var sce = shallowCopy(SCE_CONTEXTS); - - /** - * @ngdoc method - * @name $sce#isEnabled - * @kind function - * - * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you - * have to do it at module config time on {@link ng.$sceProvider $sceProvider}. - * - * @description - * Returns a boolean indicating if SCE is enabled. - */ - sce.isEnabled = function() { - return enabled; - }; - sce.trustAs = $sceDelegate.trustAs; - sce.getTrusted = $sceDelegate.getTrusted; - sce.valueOf = $sceDelegate.valueOf; - - if (!enabled) { - sce.trustAs = sce.getTrusted = function(type, value) { return value; }; - sce.valueOf = identity; - } - - /** - * @ngdoc method - * @name $sce#parseAs - * - * @description - * Converts Angular {@link guide/expression expression} into a function. This is like {@link - * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it - * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*, - * *result*)} - * - * @param {string} type The kind of SCE context in which this result will be used. - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - sce.parseAs = function sceParseAs(type, expr) { - var parsed = $parse(expr); - if (parsed.literal && parsed.constant) { - return parsed; - } else { - return $parse(expr, function(value) { - return sce.getTrusted(type, value); - }); - } - }; - - /** - * @ngdoc method - * @name $sce#trustAs - * - * @description - * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, - * returns an object that is trusted by angular for use in specified strict contextual - * escaping contexts (such as ng-bind-html, ng-include, any src attribute - * interpolation, any dom event binding attribute interpolation such as for onclick, etc.) - * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual - * escaping. - * - * @param {string} type The kind of context in which this value is safe for use. e.g. url, - * resource_url, html, js and css. - * @param {*} value The value that that should be considered trusted/safe. - * @returns {*} A value that can be used to stand in for the provided `value` in places - * where Angular expects a $sce.trustAs() return value. - */ - - /** - * @ngdoc method - * @name $sce#trustAsHtml - * - * @description - * Shorthand method. `$sce.trustAsHtml(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml - * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the - * return value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#trustAsUrl - * - * @description - * Shorthand method. `$sce.trustAsUrl(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl - * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the - * return value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#trustAsResourceUrl - * - * @description - * Shorthand method. `$sce.trustAsResourceUrl(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl - * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the return - * value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#trustAsJs - * - * @description - * Shorthand method. `$sce.trustAsJs(value)` → - * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`} - * - * @param {*} value The value to trustAs. - * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs - * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives - * only accept expressions that are either literal constants or are the - * return value of {@link ng.$sce#trustAs $sce.trustAs}.) - */ - - /** - * @ngdoc method - * @name $sce#getTrusted - * - * @description - * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such, - * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the - * originally supplied value if the queried context type is a supertype of the created type. - * If this condition isn't satisfied, throws an exception. - * - * @param {string} type The kind of context in which this value is to be used. - * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`} - * call. - * @returns {*} The value the was originally provided to - * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context. - * Otherwise, throws an exception. - */ - - /** - * @ngdoc method - * @name $sce#getTrustedHtml - * - * @description - * Shorthand method. `$sce.getTrustedHtml(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedCss - * - * @description - * Shorthand method. `$sce.getTrustedCss(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedUrl - * - * @description - * Shorthand method. `$sce.getTrustedUrl(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedResourceUrl - * - * @description - * Shorthand method. `$sce.getTrustedResourceUrl(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`} - * - * @param {*} value The value to pass to `$sceDelegate.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)` - */ - - /** - * @ngdoc method - * @name $sce#getTrustedJs - * - * @description - * Shorthand method. `$sce.getTrustedJs(value)` → - * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`} - * - * @param {*} value The value to pass to `$sce.getTrusted`. - * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)` - */ - - /** - * @ngdoc method - * @name $sce#parseAsHtml - * - * @description - * Shorthand method. `$sce.parseAsHtml(expression string)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsCss - * - * @description - * Shorthand method. `$sce.parseAsCss(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsUrl - * - * @description - * Shorthand method. `$sce.parseAsUrl(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsResourceUrl - * - * @description - * Shorthand method. `$sce.parseAsResourceUrl(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - /** - * @ngdoc method - * @name $sce#parseAsJs - * - * @description - * Shorthand method. `$sce.parseAsJs(value)` → - * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`} - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (typically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - */ - - // Shorthand delegations. - var parse = sce.parseAs, - getTrusted = sce.getTrusted, - trustAs = sce.trustAs; - - forEach(SCE_CONTEXTS, function(enumValue, name) { - var lName = lowercase(name); - sce[camelCase("parse_as_" + lName)] = function(expr) { - return parse(enumValue, expr); - }; - sce[camelCase("get_trusted_" + lName)] = function(value) { - return getTrusted(enumValue, value); - }; - sce[camelCase("trust_as_" + lName)] = function(value) { - return trustAs(enumValue, value); - }; - }); - - return sce; - }]; -} - -/** - * !!! This is an undocumented "private" service !!! - * - * @name $sniffer - * @requires $window - * @requires $document - * - * @property {boolean} history Does the browser support html5 history api ? - * @property {boolean} transitions Does the browser support CSS transition events ? - * @property {boolean} animations Does the browser support CSS animation events ? - * - * @description - * This is very simple implementation of testing browser's features. - */ -function $SnifferProvider() { - this.$get = ['$window', '$document', function($window, $document) { - var eventSupport = {}, - android = - int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]), - boxee = /Boxee/i.test(($window.navigator || {}).userAgent), - document = $document[0] || {}, - vendorPrefix, - vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/, - bodyStyle = document.body && document.body.style, - transitions = false, - animations = false, - match; - - if (bodyStyle) { - for (var prop in bodyStyle) { - if (match = vendorRegex.exec(prop)) { - vendorPrefix = match[0]; - vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1); - break; - } - } - - if (!vendorPrefix) { - vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit'; - } - - transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle)); - animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle)); - - if (android && (!transitions || !animations)) { - transitions = isString(document.body.style.webkitTransition); - animations = isString(document.body.style.webkitAnimation); - } - } - - - return { - // Android has history.pushState, but it does not update location correctly - // so let's not use the history API at all. - // http://code.google.com/p/android/issues/detail?id=17471 - // https://github.com/angular/angular.js/issues/904 - - // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has - // so let's not use the history API also - // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined - // jshint -W018 - history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee), - // jshint +W018 - hasEvent: function(event) { - // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have - // it. In particular the event is not fired when backspace or delete key are pressed or - // when cut operation is performed. - // IE10+ implements 'input' event but it erroneously fires under various situations, - // e.g. when placeholder changes, or a form is focused. - if (event === 'input' && msie <= 11) return false; - - if (isUndefined(eventSupport[event])) { - var divElm = document.createElement('div'); - eventSupport[event] = 'on' + event in divElm; - } - - return eventSupport[event]; - }, - csp: csp(), - vendorPrefix: vendorPrefix, - transitions: transitions, - animations: animations, - android: android - }; - }]; -} - -var $compileMinErr = minErr('$compile'); - -/** - * @ngdoc service - * @name $templateRequest - * - * @description - * The `$templateRequest` service downloads the provided template using `$http` and, upon success, - * stores the contents inside of `$templateCache`. If the HTTP request fails or the response data - * of the HTTP request is empty, a `$compile` error will be thrown (the exception can be thwarted - * by setting the 2nd parameter of the function to true). - * - * @param {string} tpl The HTTP request template URL - * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty - * - * @return {Promise} the HTTP Promise for the given. - * - * @property {number} totalPendingRequests total amount of pending template requests being downloaded. - */ -function $TemplateRequestProvider() { - this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) { - function handleRequestFn(tpl, ignoreRequestError) { - handleRequestFn.totalPendingRequests++; - - var transformResponse = $http.defaults && $http.defaults.transformResponse; - - if (isArray(transformResponse)) { - transformResponse = transformResponse.filter(function(transformer) { - return transformer !== defaultHttpResponseTransform; - }); - } else if (transformResponse === defaultHttpResponseTransform) { - transformResponse = null; - } - - var httpOptions = { - cache: $templateCache, - transformResponse: transformResponse - }; - - return $http.get(tpl, httpOptions) - .finally(function() { - handleRequestFn.totalPendingRequests--; - }) - .then(function(response) { - return response.data; - }, handleError); - - function handleError(resp) { - if (!ignoreRequestError) { - throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl); - } - return $q.reject(resp); - } - } - - handleRequestFn.totalPendingRequests = 0; - - return handleRequestFn; - }]; -} - -function $$TestabilityProvider() { - this.$get = ['$rootScope', '$browser', '$location', - function($rootScope, $browser, $location) { - - /** - * @name $testability - * - * @description - * The private $$testability service provides a collection of methods for use when debugging - * or by automated test and debugging tools. - */ - var testability = {}; - - /** - * @name $$testability#findBindings - * - * @description - * Returns an array of elements that are bound (via ng-bind or {{}}) - * to expressions matching the input. - * - * @param {Element} element The element root to search from. - * @param {string} expression The binding expression to match. - * @param {boolean} opt_exactMatch If true, only returns exact matches - * for the expression. Filters and whitespace are ignored. - */ - testability.findBindings = function(element, expression, opt_exactMatch) { - var bindings = element.getElementsByClassName('ng-binding'); - var matches = []; - forEach(bindings, function(binding) { - var dataBinding = angular.element(binding).data('$binding'); - if (dataBinding) { - forEach(dataBinding, function(bindingName) { - if (opt_exactMatch) { - var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)'); - if (matcher.test(bindingName)) { - matches.push(binding); - } - } else { - if (bindingName.indexOf(expression) != -1) { - matches.push(binding); - } - } - }); - } - }); - return matches; - }; - - /** - * @name $$testability#findModels - * - * @description - * Returns an array of elements that are two-way found via ng-model to - * expressions matching the input. - * - * @param {Element} element The element root to search from. - * @param {string} expression The model expression to match. - * @param {boolean} opt_exactMatch If true, only returns exact matches - * for the expression. - */ - testability.findModels = function(element, expression, opt_exactMatch) { - var prefixes = ['ng-', 'data-ng-', 'ng\\:']; - for (var p = 0; p < prefixes.length; ++p) { - var attributeEquals = opt_exactMatch ? '=' : '*='; - var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]'; - var elements = element.querySelectorAll(selector); - if (elements.length) { - return elements; - } - } - }; - - /** - * @name $$testability#getLocation - * - * @description - * Shortcut for getting the location in a browser agnostic way. Returns - * the path, search, and hash. (e.g. /path?a=b#hash) - */ - testability.getLocation = function() { - return $location.url(); - }; - - /** - * @name $$testability#setLocation - * - * @description - * Shortcut for navigating to a location without doing a full page reload. - * - * @param {string} url The location url (path, search and hash, - * e.g. /path?a=b#hash) to go to. - */ - testability.setLocation = function(url) { - if (url !== $location.url()) { - $location.url(url); - $rootScope.$digest(); - } - }; - - /** - * @name $$testability#whenStable - * - * @description - * Calls the callback when $timeout and $http requests are completed. - * - * @param {function} callback - */ - testability.whenStable = function(callback) { - $browser.notifyWhenNoOutstandingRequests(callback); - }; - - return testability; - }]; -} - -function $TimeoutProvider() { - this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler', - function($rootScope, $browser, $q, $$q, $exceptionHandler) { - var deferreds = {}; - - - /** - * @ngdoc service - * @name $timeout - * - * @description - * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch - * block and delegates any exceptions to - * {@link ng.$exceptionHandler $exceptionHandler} service. - * - * The return value of registering a timeout function is a promise, which will be resolved when - * the timeout is reached and the timeout function is executed. - * - * To cancel a timeout request, call `$timeout.cancel(promise)`. - * - * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to - * synchronously flush the queue of deferred functions. - * - * @param {function()} fn A function, whose execution should be delayed. - * @param {number=} [delay=0] Delay in milliseconds. - * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise - * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. - * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this - * promise will be resolved with is the return value of the `fn` function. - * - */ - function timeout(fn, delay, invokeApply) { - var skipApply = (isDefined(invokeApply) && !invokeApply), - deferred = (skipApply ? $$q : $q).defer(), - promise = deferred.promise, - timeoutId; - - timeoutId = $browser.defer(function() { - try { - deferred.resolve(fn()); - } catch (e) { - deferred.reject(e); - $exceptionHandler(e); - } - finally { - delete deferreds[promise.$$timeoutId]; - } - - if (!skipApply) $rootScope.$apply(); - }, delay); - - promise.$$timeoutId = timeoutId; - deferreds[timeoutId] = deferred; - - return promise; - } - - - /** - * @ngdoc method - * @name $timeout#cancel - * - * @description - * Cancels a task associated with the `promise`. As a result of this, the promise will be - * resolved with a rejection. - * - * @param {Promise=} promise Promise returned by the `$timeout` function. - * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully - * canceled. - */ - timeout.cancel = function(promise) { - if (promise && promise.$$timeoutId in deferreds) { - deferreds[promise.$$timeoutId].reject('canceled'); - delete deferreds[promise.$$timeoutId]; - return $browser.defer.cancel(promise.$$timeoutId); - } - return false; - }; - - return timeout; - }]; -} - -// NOTE: The usage of window and document instead of $window and $document here is -// deliberate. This service depends on the specific behavior of anchor nodes created by the -// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and -// cause us to break tests. In addition, when the browser resolves a URL for XHR, it -// doesn't know about mocked locations and resolves URLs to the real document - which is -// exactly the behavior needed here. There is little value is mocking these out for this -// service. -var urlParsingNode = document.createElement("a"); -var originUrl = urlResolve(window.location.href); - - -/** - * - * Implementation Notes for non-IE browsers - * ---------------------------------------- - * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM, - * results both in the normalizing and parsing of the URL. Normalizing means that a relative - * URL will be resolved into an absolute URL in the context of the application document. - * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related - * properties are all populated to reflect the normalized URL. This approach has wide - * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See - * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html - * - * Implementation Notes for IE - * --------------------------- - * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other - * browsers. However, the parsed components will not be set if the URL assigned did not specify - * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We - * work around that by performing the parsing in a 2nd step by taking a previously normalized - * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the - * properties such as protocol, hostname, port, etc. - * - * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one - * uses the inner HTML approach to assign the URL as part of an HTML snippet - - * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL. - * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception. - * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that - * method and IE < 8 is unsupported. - * - * References: - * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement - * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html - * http://url.spec.whatwg.org/#urlutils - * https://github.com/angular/angular.js/pull/2902 - * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/ - * - * @kind function - * @param {string} url The URL to be parsed. - * @description Normalizes and parses a URL. - * @returns {object} Returns the normalized URL as a dictionary. - * - * | member name | Description | - * |---------------|----------------| - * | href | A normalized version of the provided URL if it was not an absolute URL | - * | protocol | The protocol including the trailing colon | - * | host | The host and port (if the port is non-default) of the normalizedUrl | - * | search | The search params, minus the question mark | - * | hash | The hash string, minus the hash symbol - * | hostname | The hostname - * | port | The port, without ":" - * | pathname | The pathname, beginning with "/" - * - */ -function urlResolve(url) { - var href = url; - - if (msie) { - // Normalize before parse. Refer Implementation Notes on why this is - // done in two steps on IE. - urlParsingNode.setAttribute("href", href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') - ? urlParsingNode.pathname - : '/' + urlParsingNode.pathname - }; -} - -/** - * Parse a request URL and determine whether this is a same-origin request as the application document. - * - * @param {string|object} requestUrl The url of the request as a string that will be resolved - * or a parsed URL object. - * @returns {boolean} Whether the request is for the same origin as the application document. - */ -function urlIsSameOrigin(requestUrl) { - var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl; - return (parsed.protocol === originUrl.protocol && - parsed.host === originUrl.host); -} - -/** - * @ngdoc service - * @name $window - * - * @description - * A reference to the browser's `window` object. While `window` - * is globally available in JavaScript, it causes testability problems, because - * it is a global variable. In angular we always refer to it through the - * `$window` service, so it may be overridden, removed or mocked for testing. - * - * Expressions, like the one defined for the `ngClick` directive in the example - * below, are evaluated with respect to the current scope. Therefore, there is - * no risk of inadvertently coding in a dependency on a global value in such an - * expression. - * - * @example - - - -
    - - -
    -
    - - it('should display the greeting in the input box', function() { - element(by.model('greeting')).sendKeys('Hello, E2E Tests'); - // If we click the button it will block the test runner - // element(':button').click(); - }); - -
    - */ -function $WindowProvider() { - this.$get = valueFn(window); -} - -/* global currencyFilter: true, - dateFilter: true, - filterFilter: true, - jsonFilter: true, - limitToFilter: true, - lowercaseFilter: true, - numberFilter: true, - orderByFilter: true, - uppercaseFilter: true, - */ - -/** - * @ngdoc provider - * @name $filterProvider - * @description - * - * Filters are just functions which transform input to an output. However filters need to be - * Dependency Injected. To achieve this a filter definition consists of a factory function which is - * annotated with dependencies and is responsible for creating a filter function. - * - * ```js - * // Filter registration - * function MyModule($provide, $filterProvider) { - * // create a service to demonstrate injection (not always needed) - * $provide.value('greet', function(name){ - * return 'Hello ' + name + '!'; - * }); - * - * // register a filter factory which uses the - * // greet service to demonstrate DI. - * $filterProvider.register('greet', function(greet){ - * // return the filter function which uses the greet service - * // to generate salutation - * return function(text) { - * // filters need to be forgiving so check input validity - * return text && greet(text) || text; - * }; - * }); - * } - * ``` - * - * The filter function is registered with the `$injector` under the filter name suffix with - * `Filter`. - * - * ```js - * it('should be the same instance', inject( - * function($filterProvider) { - * $filterProvider.register('reverse', function(){ - * return ...; - * }); - * }, - * function($filter, reverseFilter) { - * expect($filter('reverse')).toBe(reverseFilter); - * }); - * ``` - * - * - * For more information about how angular filters work, and how to create your own filters, see - * {@link guide/filter Filters} in the Angular Developer Guide. - */ - -/** - * @ngdoc service - * @name $filter - * @kind function - * @description - * Filters are used for formatting data displayed to the user. - * - * The general syntax in templates is as follows: - * - * {{ expression [| filter_name[:parameter_value] ... ] }} - * - * @param {String} name Name of the filter function to retrieve - * @return {Function} the filter function - * @example - - -
    -

    {{ originalText }}

    -

    {{ filteredText }}

    -
    -
    - - - angular.module('filterExample', []) - .controller('MainCtrl', function($scope, $filter) { - $scope.originalText = 'hello'; - $scope.filteredText = $filter('uppercase')($scope.originalText); - }); - -
    - */ -$FilterProvider.$inject = ['$provide']; -function $FilterProvider($provide) { - var suffix = 'Filter'; - - /** - * @ngdoc method - * @name $filterProvider#register - * @param {string|Object} name Name of the filter function, or an object map of filters where - * the keys are the filter names and the values are the filter factories. - * @returns {Object} Registered filter instance, or if a map of filters was provided then a map - * of the registered filter instances. - */ - function register(name, factory) { - if (isObject(name)) { - var filters = {}; - forEach(name, function(filter, key) { - filters[key] = register(key, filter); - }); - return filters; - } else { - return $provide.factory(name + suffix, factory); - } - } - this.register = register; - - this.$get = ['$injector', function($injector) { - return function(name) { - return $injector.get(name + suffix); - }; - }]; - - //////////////////////////////////////// - - /* global - currencyFilter: false, - dateFilter: false, - filterFilter: false, - jsonFilter: false, - limitToFilter: false, - lowercaseFilter: false, - numberFilter: false, - orderByFilter: false, - uppercaseFilter: false, - */ - - register('currency', currencyFilter); - register('date', dateFilter); - register('filter', filterFilter); - register('json', jsonFilter); - register('limitTo', limitToFilter); - register('lowercase', lowercaseFilter); - register('number', numberFilter); - register('orderBy', orderByFilter); - register('uppercase', uppercaseFilter); -} - -/** - * @ngdoc filter - * @name filter - * @kind function - * - * @description - * Selects a subset of items from `array` and returns it as a new array. - * - * @param {Array} array The source array. - * @param {string|Object|function()} expression The predicate to be used for selecting items from - * `array`. - * - * Can be one of: - * - * - `string`: The string is used for matching against the contents of the `array`. All strings or - * objects with string properties in `array` that match this string will be returned. This also - * applies to nested object properties. - * The predicate can be negated by prefixing the string with `!`. - * - * - `Object`: A pattern object can be used to filter specific properties on objects contained - * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items - * which have property `name` containing "M" and property `phone` containing "1". A special - * property name `$` can be used (as in `{$:"text"}`) to accept a match against any - * property of the object or its nested object properties. That's equivalent to the simple - * substring match with a `string` as described above. The predicate can be negated by prefixing - * the string with `!`. - * For example `{name: "!M"}` predicate will return an array of items which have property `name` - * not containing "M". - * - * Note that a named property will match properties on the same level only, while the special - * `$` property will match properties on the same level or deeper. E.g. an array item like - * `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but - * **will** be matched by `{$: 'John'}`. - * - * - `function(value, index)`: A predicate function can be used to write arbitrary filters. The - * function is called for each element of `array`. The final result is an array of those - * elements that the predicate returned true for. - * - * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in - * determining if the expected value (from the filter expression) and actual value (from - * the object in the array) should be considered a match. - * - * Can be one of: - * - * - `function(actual, expected)`: - * The function will be given the object value and the predicate value to compare and - * should return true if both values should be considered equal. - * - * - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`. - * This is essentially strict comparison of expected and actual. - * - * - `false|undefined`: A short hand for a function which will look for a substring match in case - * insensitive way. - * - * @example - - -
    - - Search: - - - - - - -
    NamePhone
    {{friend.name}}{{friend.phone}}
    -
    - Any:
    - Name only
    - Phone only
    - Equality
    - - - - - - -
    NamePhone
    {{friendObj.name}}{{friendObj.phone}}
    -
    - - var expectFriendNames = function(expectedNames, key) { - element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) { - arr.forEach(function(wd, i) { - expect(wd.getText()).toMatch(expectedNames[i]); - }); - }); - }; - - it('should search across all fields when filtering with a string', function() { - var searchText = element(by.model('searchText')); - searchText.clear(); - searchText.sendKeys('m'); - expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend'); - - searchText.clear(); - searchText.sendKeys('76'); - expectFriendNames(['John', 'Julie'], 'friend'); - }); - - it('should search in specific fields when filtering with a predicate object', function() { - var searchAny = element(by.model('search.$')); - searchAny.clear(); - searchAny.sendKeys('i'); - expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj'); - }); - it('should use a equal comparison when comparator is true', function() { - var searchName = element(by.model('search.name')); - var strict = element(by.model('strict')); - searchName.clear(); - searchName.sendKeys('Julie'); - strict.click(); - expectFriendNames(['Julie'], 'friendObj'); - }); - -
    - */ -function filterFilter() { - return function(array, expression, comparator) { - if (!isArray(array)) return array; - - var predicateFn; - var matchAgainstAnyProp; - - switch (typeof expression) { - case 'function': - predicateFn = expression; - break; - case 'boolean': - case 'number': - case 'string': - matchAgainstAnyProp = true; - //jshint -W086 - case 'object': - //jshint +W086 - predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp); - break; - default: - return array; - } - - return array.filter(predicateFn); - }; -} - -// Helper functions for `filterFilter` -function createPredicateFn(expression, comparator, matchAgainstAnyProp) { - var shouldMatchPrimitives = isObject(expression) && ('$' in expression); - var predicateFn; - - if (comparator === true) { - comparator = equals; - } else if (!isFunction(comparator)) { - comparator = function(actual, expected) { - if (isObject(actual) || isObject(expected)) { - // Prevent an object to be considered equal to a string like `'[object'` - return false; - } - - actual = lowercase('' + actual); - expected = lowercase('' + expected); - return actual.indexOf(expected) !== -1; - }; - } - - predicateFn = function(item) { - if (shouldMatchPrimitives && !isObject(item)) { - return deepCompare(item, expression.$, comparator, false); - } - return deepCompare(item, expression, comparator, matchAgainstAnyProp); - }; - - return predicateFn; -} - -function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) { - var actualType = typeof actual; - var expectedType = typeof expected; - - if ((expectedType === 'string') && (expected.charAt(0) === '!')) { - return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp); - } else if (isArray(actual)) { - // In case `actual` is an array, consider it a match - // if ANY of it's items matches `expected` - return actual.some(function(item) { - return deepCompare(item, expected, comparator, matchAgainstAnyProp); - }); - } - - switch (actualType) { - case 'object': - var key; - if (matchAgainstAnyProp) { - for (key in actual) { - if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) { - return true; - } - } - return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false); - } else if (expectedType === 'object') { - for (key in expected) { - var expectedVal = expected[key]; - if (isFunction(expectedVal)) { - continue; - } - - var matchAnyProperty = key === '$'; - var actualVal = matchAnyProperty ? actual : actual[key]; - if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) { - return false; - } - } - return true; - } else { - return comparator(actual, expected); - } - break; - case 'function': - return false; - default: - return comparator(actual, expected); - } -} - -/** - * @ngdoc filter - * @name currency - * @kind function - * - * @description - * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default - * symbol for current locale is used. - * - * @param {number} amount Input to filter. - * @param {string=} symbol Currency symbol or identifier to be displayed. - * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale - * @returns {string} Formatted number. - * - * - * @example - - - -
    -
    - default currency symbol ($): {{amount | currency}}
    - custom currency identifier (USD$): {{amount | currency:"USD$"}} - no fractions (0): {{amount | currency:"USD$":0}} -
    -
    - - it('should init with 1234.56', function() { - expect(element(by.id('currency-default')).getText()).toBe('$1,234.56'); - expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56'); - expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235'); - }); - it('should update', function() { - if (browser.params.browser == 'safari') { - // Safari does not understand the minus key. See - // https://github.com/angular/protractor/issues/481 - return; - } - element(by.model('amount')).clear(); - element(by.model('amount')).sendKeys('-1234'); - expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)'); - expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)'); - expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)'); - }); - -
    - */ -currencyFilter.$inject = ['$locale']; -function currencyFilter($locale) { - var formats = $locale.NUMBER_FORMATS; - return function(amount, currencySymbol, fractionSize) { - if (isUndefined(currencySymbol)) { - currencySymbol = formats.CURRENCY_SYM; - } - - if (isUndefined(fractionSize)) { - fractionSize = formats.PATTERNS[1].maxFrac; - } - - // if null or undefined pass it through - return (amount == null) - ? amount - : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize). - replace(/\u00A4/g, currencySymbol); - }; -} - -/** - * @ngdoc filter - * @name number - * @kind function - * - * @description - * Formats a number as text. - * - * If the input is not a number an empty string is returned. - * - * @param {number|string} number Number to format. - * @param {(number|string)=} fractionSize Number of decimal places to round the number to. - * If this is not provided then the fraction size is computed from the current locale's number - * formatting pattern. In the case of the default locale, it will be 3. - * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. - * - * @example - - - -
    - Enter number:
    - Default formatting: {{val | number}}
    - No fractions: {{val | number:0}}
    - Negative number: {{-val | number:4}} -
    -
    - - it('should format numbers', function() { - expect(element(by.id('number-default')).getText()).toBe('1,234.568'); - expect(element(by.binding('val | number:0')).getText()).toBe('1,235'); - expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679'); - }); - - it('should update', function() { - element(by.model('val')).clear(); - element(by.model('val')).sendKeys('3374.333'); - expect(element(by.id('number-default')).getText()).toBe('3,374.333'); - expect(element(by.binding('val | number:0')).getText()).toBe('3,374'); - expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330'); - }); - -
    - */ - - -numberFilter.$inject = ['$locale']; -function numberFilter($locale) { - var formats = $locale.NUMBER_FORMATS; - return function(number, fractionSize) { - - // if null or undefined pass it through - return (number == null) - ? number - : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, - fractionSize); - }; -} - -var DECIMAL_SEP = '.'; -function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { - if (!isFinite(number) || isObject(number)) return ''; - - var isNegative = number < 0; - number = Math.abs(number); - var numStr = number + '', - formatedText = '', - parts = []; - - var hasExponent = false; - if (numStr.indexOf('e') !== -1) { - var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); - if (match && match[2] == '-' && match[3] > fractionSize + 1) { - number = 0; - } else { - formatedText = numStr; - hasExponent = true; - } - } - - if (!hasExponent) { - var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; - - // determine fractionSize if it is not specified - if (isUndefined(fractionSize)) { - fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); - } - - // safely round numbers in JS without hitting imprecisions of floating-point arithmetics - // inspired by: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round - number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize); - - var fraction = ('' + number).split(DECIMAL_SEP); - var whole = fraction[0]; - fraction = fraction[1] || ''; - - var i, pos = 0, - lgroup = pattern.lgSize, - group = pattern.gSize; - - if (whole.length >= (lgroup + group)) { - pos = whole.length - lgroup; - for (i = 0; i < pos; i++) { - if ((pos - i) % group === 0 && i !== 0) { - formatedText += groupSep; - } - formatedText += whole.charAt(i); - } - } - - for (i = pos; i < whole.length; i++) { - if ((whole.length - i) % lgroup === 0 && i !== 0) { - formatedText += groupSep; - } - formatedText += whole.charAt(i); - } - - // format fraction part. - while (fraction.length < fractionSize) { - fraction += '0'; - } - - if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); - } else { - if (fractionSize > 0 && number < 1) { - formatedText = number.toFixed(fractionSize); - number = parseFloat(formatedText); - } - } - - if (number === 0) { - isNegative = false; - } - - parts.push(isNegative ? pattern.negPre : pattern.posPre, - formatedText, - isNegative ? pattern.negSuf : pattern.posSuf); - return parts.join(''); -} - -function padNumber(num, digits, trim) { - var neg = ''; - if (num < 0) { - neg = '-'; - num = -num; - } - num = '' + num; - while (num.length < digits) num = '0' + num; - if (trim) - num = num.substr(num.length - digits); - return neg + num; -} - - -function dateGetter(name, size, offset, trim) { - offset = offset || 0; - return function(date) { - var value = date['get' + name](); - if (offset > 0 || value > -offset) - value += offset; - if (value === 0 && offset == -12) value = 12; - return padNumber(value, size, trim); - }; -} - -function dateStrGetter(name, shortForm) { - return function(date, formats) { - var value = date['get' + name](); - var get = uppercase(shortForm ? ('SHORT' + name) : name); - - return formats[get][value]; - }; -} - -function timeZoneGetter(date) { - var zone = -1 * date.getTimezoneOffset(); - var paddedZone = (zone >= 0) ? "+" : ""; - - paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) + - padNumber(Math.abs(zone % 60), 2); - - return paddedZone; -} - -function getFirstThursdayOfYear(year) { - // 0 = index of January - var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay(); - // 4 = index of Thursday (+1 to account for 1st = 5) - // 11 = index of *next* Thursday (+1 account for 1st = 12) - return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst); -} - -function getThursdayThisWeek(datetime) { - return new Date(datetime.getFullYear(), datetime.getMonth(), - // 4 = index of Thursday - datetime.getDate() + (4 - datetime.getDay())); -} - -function weekGetter(size) { - return function(date) { - var firstThurs = getFirstThursdayOfYear(date.getFullYear()), - thisThurs = getThursdayThisWeek(date); - - var diff = +thisThurs - +firstThurs, - result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week - - return padNumber(result, size); - }; -} - -function ampmGetter(date, formats) { - return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; -} - -var DATE_FORMATS = { - yyyy: dateGetter('FullYear', 4), - yy: dateGetter('FullYear', 2, 0, true), - y: dateGetter('FullYear', 1), - MMMM: dateStrGetter('Month'), - MMM: dateStrGetter('Month', true), - MM: dateGetter('Month', 2, 1), - M: dateGetter('Month', 1, 1), - dd: dateGetter('Date', 2), - d: dateGetter('Date', 1), - HH: dateGetter('Hours', 2), - H: dateGetter('Hours', 1), - hh: dateGetter('Hours', 2, -12), - h: dateGetter('Hours', 1, -12), - mm: dateGetter('Minutes', 2), - m: dateGetter('Minutes', 1), - ss: dateGetter('Seconds', 2), - s: dateGetter('Seconds', 1), - // while ISO 8601 requires fractions to be prefixed with `.` or `,` - // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions - sss: dateGetter('Milliseconds', 3), - EEEE: dateStrGetter('Day'), - EEE: dateStrGetter('Day', true), - a: ampmGetter, - Z: timeZoneGetter, - ww: weekGetter(2), - w: weekGetter(1) -}; - -var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/, - NUMBER_STRING = /^\-?\d+$/; - -/** - * @ngdoc filter - * @name date - * @kind function - * - * @description - * Formats `date` to a string based on the requested `format`. - * - * `format` string can be composed of the following elements: - * - * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) - * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) - * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) - * * `'MMMM'`: Month in year (January-December) - * * `'MMM'`: Month in year (Jan-Dec) - * * `'MM'`: Month in year, padded (01-12) - * * `'M'`: Month in year (1-12) - * * `'dd'`: Day in month, padded (01-31) - * * `'d'`: Day in month (1-31) - * * `'EEEE'`: Day in Week,(Sunday-Saturday) - * * `'EEE'`: Day in Week, (Sun-Sat) - * * `'HH'`: Hour in day, padded (00-23) - * * `'H'`: Hour in day (0-23) - * * `'hh'`: Hour in AM/PM, padded (01-12) - * * `'h'`: Hour in AM/PM, (1-12) - * * `'mm'`: Minute in hour, padded (00-59) - * * `'m'`: Minute in hour (0-59) - * * `'ss'`: Second in minute, padded (00-59) - * * `'s'`: Second in minute (0-59) - * * `'sss'`: Millisecond in second, padded (000-999) - * * `'a'`: AM/PM marker - * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200) - * * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year - * * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year - * - * `format` string can also be one of the following predefined - * {@link guide/i18n localizable formats}: - * - * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale - * (e.g. Sep 3, 2010 12:05:08 PM) - * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM) - * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale - * (e.g. Friday, September 3, 2010) - * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010) - * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) - * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) - * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM) - * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM) - * - * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g. - * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence - * (e.g. `"h 'o''clock'"`). - * - * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or - * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its - * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is - * specified in the string input, the time is considered to be in the local timezone. - * @param {string=} format Formatting rules (see Description). If not specified, - * `mediumDate` is used. - * @param {string=} timezone Timezone to be used for formatting. Right now, only `'UTC'` is supported. - * If not specified, the timezone of the browser will be used. - * @returns {string} Formatted string or the input if input is not recognized as date/millis. - * - * @example - - - {{1288323623006 | date:'medium'}}: - {{1288323623006 | date:'medium'}}
    - {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: - {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
    - {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: - {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
    - {{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}: - {{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}
    -
    - - it('should format date', function() { - expect(element(by.binding("1288323623006 | date:'medium'")).getText()). - toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); - expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()). - toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); - expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()). - toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); - expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()). - toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/); - }); - -
    - */ -dateFilter.$inject = ['$locale']; -function dateFilter($locale) { - - - var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; - // 1 2 3 4 5 6 7 8 9 10 11 - function jsonStringToDate(string) { - var match; - if (match = string.match(R_ISO8601_STR)) { - var date = new Date(0), - tzHour = 0, - tzMin = 0, - dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear, - timeSetter = match[8] ? date.setUTCHours : date.setHours; - - if (match[9]) { - tzHour = int(match[9] + match[10]); - tzMin = int(match[9] + match[11]); - } - dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3])); - var h = int(match[4] || 0) - tzHour; - var m = int(match[5] || 0) - tzMin; - var s = int(match[6] || 0); - var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000); - timeSetter.call(date, h, m, s, ms); - return date; - } - return string; - } - - - return function(date, format, timezone) { - var text = '', - parts = [], - fn, match; - - format = format || 'mediumDate'; - format = $locale.DATETIME_FORMATS[format] || format; - if (isString(date)) { - date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date); - } - - if (isNumber(date)) { - date = new Date(date); - } - - if (!isDate(date)) { - return date; - } - - while (format) { - match = DATE_FORMATS_SPLIT.exec(format); - if (match) { - parts = concat(parts, match, 1); - format = parts.pop(); - } else { - parts.push(format); - format = null; - } - } - - if (timezone && timezone === 'UTC') { - date = new Date(date.getTime()); - date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); - } - forEach(parts, function(value) { - fn = DATE_FORMATS[value]; - text += fn ? fn(date, $locale.DATETIME_FORMATS) - : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); - }); - - return text; - }; -} - - -/** - * @ngdoc filter - * @name json - * @kind function - * - * @description - * Allows you to convert a JavaScript object into JSON string. - * - * This filter is mostly useful for debugging. When using the double curly {{value}} notation - * the binding is automatically converted to JSON. - * - * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. - * @param {number=} spacing The number of spaces to use per indentation, defaults to 2. - * @returns {string} JSON string. - * - * - * @example - - -
    {{ {'name':'value'} | json }}
    -
    {{ {'name':'value'} | json:4 }}
    -
    - - it('should jsonify filtered objects', function() { - expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); - expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/); - }); - -
    - * - */ -function jsonFilter() { - return function(object, spacing) { - if (isUndefined(spacing)) { - spacing = 2; - } - return toJson(object, spacing); - }; -} - - -/** - * @ngdoc filter - * @name lowercase - * @kind function - * @description - * Converts string to lowercase. - * @see angular.lowercase - */ -var lowercaseFilter = valueFn(lowercase); - - -/** - * @ngdoc filter - * @name uppercase - * @kind function - * @description - * Converts string to uppercase. - * @see angular.uppercase - */ -var uppercaseFilter = valueFn(uppercase); - -/** - * @ngdoc filter - * @name limitTo - * @kind function - * - * @description - * Creates a new array or string containing only a specified number of elements. The elements - * are taken from either the beginning or the end of the source array, string or number, as specified by - * the value and sign (positive or negative) of `limit`. If a number is used as input, it is - * converted to a string. - * - * @param {Array|string|number} input Source array, string or number to be limited. - * @param {string|number} limit The length of the returned array or string. If the `limit` number - * is positive, `limit` number of items from the beginning of the source array/string are copied. - * If the number is negative, `limit` number of items from the end of the source array/string - * are copied. The `limit` will be trimmed if it exceeds `array.length` - * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array - * had less than `limit` elements. - * - * @example - - - -
    - Limit {{numbers}} to: -

    Output numbers: {{ numbers | limitTo:numLimit }}

    - Limit {{letters}} to: -

    Output letters: {{ letters | limitTo:letterLimit }}

    - Limit {{longNumber}} to: -

    Output long number: {{ longNumber | limitTo:longNumberLimit }}

    -
    -
    - - var numLimitInput = element(by.model('numLimit')); - var letterLimitInput = element(by.model('letterLimit')); - var longNumberLimitInput = element(by.model('longNumberLimit')); - var limitedNumbers = element(by.binding('numbers | limitTo:numLimit')); - var limitedLetters = element(by.binding('letters | limitTo:letterLimit')); - var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit')); - - it('should limit the number array to first three items', function() { - expect(numLimitInput.getAttribute('value')).toBe('3'); - expect(letterLimitInput.getAttribute('value')).toBe('3'); - expect(longNumberLimitInput.getAttribute('value')).toBe('3'); - expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]'); - expect(limitedLetters.getText()).toEqual('Output letters: abc'); - expect(limitedLongNumber.getText()).toEqual('Output long number: 234'); - }); - - // There is a bug in safari and protractor that doesn't like the minus key - // it('should update the output when -3 is entered', function() { - // numLimitInput.clear(); - // numLimitInput.sendKeys('-3'); - // letterLimitInput.clear(); - // letterLimitInput.sendKeys('-3'); - // longNumberLimitInput.clear(); - // longNumberLimitInput.sendKeys('-3'); - // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]'); - // expect(limitedLetters.getText()).toEqual('Output letters: ghi'); - // expect(limitedLongNumber.getText()).toEqual('Output long number: 342'); - // }); - - it('should not exceed the maximum size of input array', function() { - numLimitInput.clear(); - numLimitInput.sendKeys('100'); - letterLimitInput.clear(); - letterLimitInput.sendKeys('100'); - longNumberLimitInput.clear(); - longNumberLimitInput.sendKeys('100'); - expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]'); - expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi'); - expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342'); - }); - -
    -*/ -function limitToFilter() { - return function(input, limit) { - if (isNumber(input)) input = input.toString(); - if (!isArray(input) && !isString(input)) return input; - - if (Math.abs(Number(limit)) === Infinity) { - limit = Number(limit); - } else { - limit = int(limit); - } - - //NaN check on limit - if (limit) { - return limit > 0 ? input.slice(0, limit) : input.slice(limit); - } else { - return isString(input) ? "" : []; - } - }; -} - -/** - * @ngdoc filter - * @name orderBy - * @kind function - * - * @description - * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically - * for strings and numerically for numbers. Note: if you notice numbers are not being sorted - * correctly, make sure they are actually being saved as numbers and not strings. - * - * @param {Array} array The array to sort. - * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be - * used by the comparator to determine the order of elements. - * - * Can be one of: - * - * - `function`: Getter function. The result of this function will be sorted using the - * `<`, `=`, `>` operator. - * - `string`: An Angular expression. The result of this expression is used to compare elements - * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by - * 3 first characters of a property called `name`). The result of a constant expression - * is interpreted as a property name to be used in comparisons (for example `"special name"` - * to sort object by the value of their `special name` property). An expression can be - * optionally prefixed with `+` or `-` to control ascending or descending sort order - * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array - * element itself is used to compare where sorting. - * - `Array`: An array of function or string predicates. The first predicate in the array - * is used for sorting, but when two items are equivalent, the next predicate is used. - * - * If the predicate is missing or empty then it defaults to `'+'`. - * - * @param {boolean=} reverse Reverse the order of the array. - * @returns {Array} Sorted copy of the source array. - * - * @example - - - -
    -
    Sorting predicate = {{predicate}}; reverse = {{reverse}}
    -
    - [ unsorted ] - - - - - - - - - - - -
    Name - (^)Phone NumberAge
    {{friend.name}}{{friend.phone}}{{friend.age}}
    -
    -
    -
    - * - * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the - * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the - * desired parameters. - * - * Example: - * - * @example - - -
    - - - - - - - - - - - -
    Name - (^)Phone NumberAge
    {{friend.name}}{{friend.phone}}{{friend.age}}
    -
    -
    - - - angular.module('orderByExample', []) - .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) { - var orderBy = $filter('orderBy'); - $scope.friends = [ - { name: 'John', phone: '555-1212', age: 10 }, - { name: 'Mary', phone: '555-9876', age: 19 }, - { name: 'Mike', phone: '555-4321', age: 21 }, - { name: 'Adam', phone: '555-5678', age: 35 }, - { name: 'Julie', phone: '555-8765', age: 29 } - ]; - $scope.order = function(predicate, reverse) { - $scope.friends = orderBy($scope.friends, predicate, reverse); - }; - $scope.order('-age',false); - }]); - -
    - */ -orderByFilter.$inject = ['$parse']; -function orderByFilter($parse) { - return function(array, sortPredicate, reverseOrder) { - if (!(isArrayLike(array))) return array; - sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate]; - if (sortPredicate.length === 0) { sortPredicate = ['+']; } - sortPredicate = sortPredicate.map(function(predicate) { - var descending = false, get = predicate || identity; - if (isString(predicate)) { - if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { - descending = predicate.charAt(0) == '-'; - predicate = predicate.substring(1); - } - if (predicate === '') { - // Effectively no predicate was passed so we compare identity - return reverseComparator(compare, descending); - } - get = $parse(predicate); - if (get.constant) { - var key = get(); - return reverseComparator(function(a, b) { - return compare(a[key], b[key]); - }, descending); - } - } - return reverseComparator(function(a, b) { - return compare(get(a),get(b)); - }, descending); - }); - return slice.call(array).sort(reverseComparator(comparator, reverseOrder)); - - function comparator(o1, o2) { - for (var i = 0; i < sortPredicate.length; i++) { - var comp = sortPredicate[i](o1, o2); - if (comp !== 0) return comp; - } - return 0; - } - function reverseComparator(comp, descending) { - return descending - ? function(a, b) {return comp(b,a);} - : comp; - } - - function isPrimitive(value) { - switch (typeof value) { - case 'number': /* falls through */ - case 'boolean': /* falls through */ - case 'string': - return true; - default: - return false; - } - } - - function objectToString(value) { - if (value === null) return 'null'; - if (typeof value.valueOf === 'function') { - value = value.valueOf(); - if (isPrimitive(value)) return value; - } - if (typeof value.toString === 'function') { - value = value.toString(); - if (isPrimitive(value)) return value; - } - return ''; - } - - function compare(v1, v2) { - var t1 = typeof v1; - var t2 = typeof v2; - if (t1 === t2 && t1 === "object") { - v1 = objectToString(v1); - v2 = objectToString(v2); - } - if (t1 === t2) { - if (t1 === "string") { - v1 = v1.toLowerCase(); - v2 = v2.toLowerCase(); - } - if (v1 === v2) return 0; - return v1 < v2 ? -1 : 1; - } else { - return t1 < t2 ? -1 : 1; - } - } - }; -} - -function ngDirective(directive) { - if (isFunction(directive)) { - directive = { - link: directive - }; - } - directive.restrict = directive.restrict || 'AC'; - return valueFn(directive); -} - -/** - * @ngdoc directive - * @name a - * @restrict E - * - * @description - * Modifies the default behavior of the html A tag so that the default action is prevented when - * the href attribute is empty. - * - * This change permits the easy creation of action links with the `ngClick` directive - * without changing the location or causing page reloads, e.g.: - * `Add Item` - */ -var htmlAnchorDirective = valueFn({ - restrict: 'E', - compile: function(element, attr) { - if (!attr.href && !attr.xlinkHref && !attr.name) { - return function(scope, element) { - // If the linked element is not an anchor tag anymore, do nothing - if (element[0].nodeName.toLowerCase() !== 'a') return; - - // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute. - var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ? - 'xlink:href' : 'href'; - element.on('click', function(event) { - // if we have no href url, then don't navigate anywhere. - if (!element.attr(href)) { - event.preventDefault(); - } - }); - }; - } - } -}); - -/** - * @ngdoc directive - * @name ngHref - * @restrict A - * @priority 99 - * - * @description - * Using Angular markup like `{{hash}}` in an href attribute will - * make the link go to the wrong URL if the user clicks it before - * Angular has a chance to replace the `{{hash}}` markup with its - * value. Until Angular replaces the markup the link will be broken - * and will most likely return a 404 error. The `ngHref` directive - * solves this problem. - * - * The wrong way to write it: - * ```html - * link1 - * ``` - * - * The correct way to write it: - * ```html - * link1 - * ``` - * - * @element A - * @param {template} ngHref any string which can contain `{{}}` markup. - * - * @example - * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes - * in links and their different behaviors: - - -
    - link 1 (link, don't reload)
    - link 2 (link, don't reload)
    - link 3 (link, reload!)
    - anchor (link, don't reload)
    - anchor (no link)
    - link (link, change location) -
    - - it('should execute ng-click but not reload when href without value', function() { - element(by.id('link-1')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('1'); - expect(element(by.id('link-1')).getAttribute('href')).toBe(''); - }); - - it('should execute ng-click but not reload when href empty string', function() { - element(by.id('link-2')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('2'); - expect(element(by.id('link-2')).getAttribute('href')).toBe(''); - }); - - it('should execute ng-click and change url when ng-href specified', function() { - expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/); - - element(by.id('link-3')).click(); - - // At this point, we navigate away from an Angular page, so we need - // to use browser.driver to get the base webdriver. - - browser.wait(function() { - return browser.driver.getCurrentUrl().then(function(url) { - return url.match(/\/123$/); - }); - }, 5000, 'page should navigate to /123'); - }); - - xit('should execute ng-click but not reload when href empty string and name specified', function() { - element(by.id('link-4')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('4'); - expect(element(by.id('link-4')).getAttribute('href')).toBe(''); - }); - - it('should execute ng-click but not reload when no href but name specified', function() { - element(by.id('link-5')).click(); - expect(element(by.model('value')).getAttribute('value')).toEqual('5'); - expect(element(by.id('link-5')).getAttribute('href')).toBe(null); - }); - - it('should only change url when only ng-href', function() { - element(by.model('value')).clear(); - element(by.model('value')).sendKeys('6'); - expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/); - - element(by.id('link-6')).click(); - - // At this point, we navigate away from an Angular page, so we need - // to use browser.driver to get the base webdriver. - browser.wait(function() { - return browser.driver.getCurrentUrl().then(function(url) { - return url.match(/\/6$/); - }); - }, 5000, 'page should navigate to /6'); - }); - -
    - */ - -/** - * @ngdoc directive - * @name ngSrc - * @restrict A - * @priority 99 - * - * @description - * Using Angular markup like `{{hash}}` in a `src` attribute doesn't - * work right: The browser will fetch from the URL with the literal - * text `{{hash}}` until Angular replaces the expression inside - * `{{hash}}`. The `ngSrc` directive solves this problem. - * - * The buggy way to write it: - * ```html - * - * ``` - * - * The correct way to write it: - * ```html - * - * ``` - * - * @element IMG - * @param {template} ngSrc any string which can contain `{{}}` markup. - */ - -/** - * @ngdoc directive - * @name ngSrcset - * @restrict A - * @priority 99 - * - * @description - * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't - * work right: The browser will fetch from the URL with the literal - * text `{{hash}}` until Angular replaces the expression inside - * `{{hash}}`. The `ngSrcset` directive solves this problem. - * - * The buggy way to write it: - * ```html - * - * ``` - * - * The correct way to write it: - * ```html - * - * ``` - * - * @element IMG - * @param {template} ngSrcset any string which can contain `{{}}` markup. - */ - -/** - * @ngdoc directive - * @name ngDisabled - * @restrict A - * @priority 100 - * - * @description - * - * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs: - * ```html - *
    - * - *
    - * ``` - * - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as disabled. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngDisabled` directive solves this problem for the `disabled` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. - * - * @example - - - Click me to toggle:
    - -
    - - it('should toggle button', function() { - expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy(); - element(by.model('checked')).click(); - expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy(); - }); - -
    - * - * @element INPUT - * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, - * then special attribute "disabled" will be set on the element - */ - - -/** - * @ngdoc directive - * @name ngChecked - * @restrict A - * @priority 100 - * - * @description - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as checked. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngChecked` directive solves this problem for the `checked` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. - * @example - - - Check me to check both:
    - -
    - - it('should check both checkBoxes', function() { - expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy(); - element(by.model('master')).click(); - expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy(); - }); - -
    - * - * @element INPUT - * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, - * then special attribute "checked" will be set on the element - */ - - -/** - * @ngdoc directive - * @name ngReadonly - * @restrict A - * @priority 100 - * - * @description - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as readonly. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngReadonly` directive solves this problem for the `readonly` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. - * @example - - - Check me to make text readonly:
    - -
    - - it('should toggle readonly attr', function() { - expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy(); - element(by.model('checked')).click(); - expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy(); - }); - -
    - * - * @element INPUT - * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, - * then special attribute "readonly" will be set on the element - */ - - -/** - * @ngdoc directive - * @name ngSelected - * @restrict A - * @priority 100 - * - * @description - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as selected. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngSelected` directive solves this problem for the `selected` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. - * - * @example - - - Check me to select:
    - -
    - - it('should select Greetings!', function() { - expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy(); - element(by.model('selected')).click(); - expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy(); - }); - -
    - * - * @element OPTION - * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, - * then special attribute "selected" will be set on the element - */ - -/** - * @ngdoc directive - * @name ngOpen - * @restrict A - * @priority 100 - * - * @description - * The HTML specification does not require browsers to preserve the values of boolean attributes - * such as open. (Their presence means true and their absence means false.) - * If we put an Angular interpolation expression into such an attribute then the - * binding information would be lost when the browser removes the attribute. - * The `ngOpen` directive solves this problem for the `open` attribute. - * This complementary directive is not removed by the browser and so provides - * a permanent reliable place to store the binding information. - * @example - - - Check me check multiple:
    -
    - Show/Hide me -
    -
    - - it('should toggle open', function() { - expect(element(by.id('details')).getAttribute('open')).toBeFalsy(); - element(by.model('open')).click(); - expect(element(by.id('details')).getAttribute('open')).toBeTruthy(); - }); - -
    - * - * @element DETAILS - * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, - * then special attribute "open" will be set on the element - */ - -var ngAttributeAliasDirectives = {}; - - -// boolean attrs are evaluated -forEach(BOOLEAN_ATTR, function(propName, attrName) { - // binding to multiple is not supported - if (propName == "multiple") return; - - var normalized = directiveNormalize('ng-' + attrName); - ngAttributeAliasDirectives[normalized] = function() { - return { - restrict: 'A', - priority: 100, - link: function(scope, element, attr) { - scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { - attr.$set(attrName, !!value); - }); - } - }; - }; -}); - -// aliased input attrs are evaluated -forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) { - ngAttributeAliasDirectives[ngAttr] = function() { - return { - priority: 100, - link: function(scope, element, attr) { - //special case ngPattern when a literal regular expression value - //is used as the expression (this way we don't have to watch anything). - if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") { - var match = attr.ngPattern.match(REGEX_STRING_REGEXP); - if (match) { - attr.$set("ngPattern", new RegExp(match[1], match[2])); - return; - } - } - - scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) { - attr.$set(ngAttr, value); - }); - } - }; - }; -}); - -// ng-src, ng-srcset, ng-href are interpolated -forEach(['src', 'srcset', 'href'], function(attrName) { - var normalized = directiveNormalize('ng-' + attrName); - ngAttributeAliasDirectives[normalized] = function() { - return { - priority: 99, // it needs to run after the attributes are interpolated - link: function(scope, element, attr) { - var propName = attrName, - name = attrName; - - if (attrName === 'href' && - toString.call(element.prop('href')) === '[object SVGAnimatedString]') { - name = 'xlinkHref'; - attr.$attr[name] = 'xlink:href'; - propName = null; - } - - attr.$observe(normalized, function(value) { - if (!value) { - if (attrName === 'href') { - attr.$set(name, null); - } - return; - } - - attr.$set(name, value); - - // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist - // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need - // to set the property as well to achieve the desired effect. - // we use attr[attrName] value since $set can sanitize the url. - if (msie && propName) element.prop(propName, attr[name]); - }); - } - }; - }; -}); - -/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true - */ -var nullFormCtrl = { - $addControl: noop, - $$renameControl: nullFormRenameControl, - $removeControl: noop, - $setValidity: noop, - $setDirty: noop, - $setPristine: noop, - $setSubmitted: noop -}, -SUBMITTED_CLASS = 'ng-submitted'; - -function nullFormRenameControl(control, name) { - control.$name = name; -} - -/** - * @ngdoc type - * @name form.FormController - * - * @property {boolean} $pristine True if user has not interacted with the form yet. - * @property {boolean} $dirty True if user has already interacted with the form. - * @property {boolean} $valid True if all of the containing forms and controls are valid. - * @property {boolean} $invalid True if at least one containing control or form is invalid. - * @property {boolean} $submitted True if user has submitted the form even if its invalid. - * - * @property {Object} $error Is an object hash, containing references to controls or - * forms with failing validators, where: - * - * - keys are validation tokens (error names), - * - values are arrays of controls or forms that have a failing validator for given error name. - * - * Built-in validation tokens: - * - * - `email` - * - `max` - * - `maxlength` - * - `min` - * - `minlength` - * - `number` - * - `pattern` - * - `required` - * - `url` - * - `date` - * - `datetimelocal` - * - `time` - * - `week` - * - `month` - * - * @description - * `FormController` keeps track of all its controls and nested forms as well as the state of them, - * such as being valid/invalid or dirty/pristine. - * - * Each {@link ng.directive:form form} directive creates an instance - * of `FormController`. - * - */ -//asks for $scope to fool the BC controller module -FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate']; -function FormController(element, attrs, $scope, $animate, $interpolate) { - var form = this, - controls = []; - - var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl; - - // init state - form.$error = {}; - form.$$success = {}; - form.$pending = undefined; - form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope); - form.$dirty = false; - form.$pristine = true; - form.$valid = true; - form.$invalid = false; - form.$submitted = false; - - parentForm.$addControl(form); - - /** - * @ngdoc method - * @name form.FormController#$rollbackViewValue - * - * @description - * Rollback all form controls pending updates to the `$modelValue`. - * - * Updates may be pending by a debounced event or because the input is waiting for a some future - * event defined in `ng-model-options`. This method is typically needed by the reset button of - * a form that uses `ng-model-options` to pend updates. - */ - form.$rollbackViewValue = function() { - forEach(controls, function(control) { - control.$rollbackViewValue(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$commitViewValue - * - * @description - * Commit all form controls pending updates to the `$modelValue`. - * - * Updates may be pending by a debounced event or because the input is waiting for a some future - * event defined in `ng-model-options`. This method is rarely needed as `NgModelController` - * usually handles calling this in response to input events. - */ - form.$commitViewValue = function() { - forEach(controls, function(control) { - control.$commitViewValue(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$addControl - * - * @description - * Register a control with the form. - * - * Input elements using ngModelController do this automatically when they are linked. - */ - form.$addControl = function(control) { - // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored - // and not added to the scope. Now we throw an error. - assertNotHasOwnProperty(control.$name, 'input'); - controls.push(control); - - if (control.$name) { - form[control.$name] = control; - } - }; - - // Private API: rename a form control - form.$$renameControl = function(control, newName) { - var oldName = control.$name; - - if (form[oldName] === control) { - delete form[oldName]; - } - form[newName] = control; - control.$name = newName; - }; - - /** - * @ngdoc method - * @name form.FormController#$removeControl - * - * @description - * Deregister a control from the form. - * - * Input elements using ngModelController do this automatically when they are destroyed. - */ - form.$removeControl = function(control) { - if (control.$name && form[control.$name] === control) { - delete form[control.$name]; - } - forEach(form.$pending, function(value, name) { - form.$setValidity(name, null, control); - }); - forEach(form.$error, function(value, name) { - form.$setValidity(name, null, control); - }); - forEach(form.$$success, function(value, name) { - form.$setValidity(name, null, control); - }); - - arrayRemove(controls, control); - }; - - - /** - * @ngdoc method - * @name form.FormController#$setValidity - * - * @description - * Sets the validity of a form control. - * - * This method will also propagate to parent forms. - */ - addSetValidityMethod({ - ctrl: this, - $element: element, - set: function(object, property, controller) { - var list = object[property]; - if (!list) { - object[property] = [controller]; - } else { - var index = list.indexOf(controller); - if (index === -1) { - list.push(controller); - } - } - }, - unset: function(object, property, controller) { - var list = object[property]; - if (!list) { - return; - } - arrayRemove(list, controller); - if (list.length === 0) { - delete object[property]; - } - }, - parentForm: parentForm, - $animate: $animate - }); - - /** - * @ngdoc method - * @name form.FormController#$setDirty - * - * @description - * Sets the form to a dirty state. - * - * This method can be called to add the 'ng-dirty' class and set the form to a dirty - * state (ng-dirty class). This method will also propagate to parent forms. - */ - form.$setDirty = function() { - $animate.removeClass(element, PRISTINE_CLASS); - $animate.addClass(element, DIRTY_CLASS); - form.$dirty = true; - form.$pristine = false; - parentForm.$setDirty(); - }; - - /** - * @ngdoc method - * @name form.FormController#$setPristine - * - * @description - * Sets the form to its pristine state. - * - * This method can be called to remove the 'ng-dirty' class and set the form to its pristine - * state (ng-pristine class). This method will also propagate to all the controls contained - * in this form. - * - * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after - * saving or resetting it. - */ - form.$setPristine = function() { - $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS); - form.$dirty = false; - form.$pristine = true; - form.$submitted = false; - forEach(controls, function(control) { - control.$setPristine(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$setUntouched - * - * @description - * Sets the form to its untouched state. - * - * This method can be called to remove the 'ng-touched' class and set the form controls to their - * untouched state (ng-untouched class). - * - * Setting a form controls back to their untouched state is often useful when setting the form - * back to its pristine state. - */ - form.$setUntouched = function() { - forEach(controls, function(control) { - control.$setUntouched(); - }); - }; - - /** - * @ngdoc method - * @name form.FormController#$setSubmitted - * - * @description - * Sets the form to its submitted state. - */ - form.$setSubmitted = function() { - $animate.addClass(element, SUBMITTED_CLASS); - form.$submitted = true; - parentForm.$setSubmitted(); - }; -} - -/** - * @ngdoc directive - * @name ngForm - * @restrict EAC - * - * @description - * Nestable alias of {@link ng.directive:form `form`} directive. HTML - * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a - * sub-group of controls needs to be determined. - * - * Note: the purpose of `ngForm` is to group controls, - * but not to be a replacement for the `
    ` tag with all of its capabilities - * (e.g. posting to the server, ...). - * - * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into - * related scope, under this name. - * - */ - - /** - * @ngdoc directive - * @name form - * @restrict E - * - * @description - * Directive that instantiates - * {@link form.FormController FormController}. - * - * If the `name` attribute is specified, the form controller is published onto the current scope under - * this name. - * - * # Alias: {@link ng.directive:ngForm `ngForm`} - * - * In Angular forms can be nested. This means that the outer form is valid when all of the child - * forms are valid as well. However, browsers do not allow nesting of `` elements, so - * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to - * `` but can be nested. This allows you to have nested forms, which is very useful when - * using Angular validation directives in forms that are dynamically generated using the - * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name` - * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an - * `ngForm` directive and nest these in an outer `form` element. - * - * - * # CSS classes - * - `ng-valid` is set if the form is valid. - * - `ng-invalid` is set if the form is invalid. - * - `ng-pristine` is set if the form is pristine. - * - `ng-dirty` is set if the form is dirty. - * - `ng-submitted` is set if the form was submitted. - * - * Keep in mind that ngAnimate can detect each of these classes when added and removed. - * - * - * # Submitting a form and preventing the default action - * - * Since the role of forms in client-side Angular applications is different than in classical - * roundtrip apps, it is desirable for the browser not to translate the form submission into a full - * page reload that sends the data to the server. Instead some javascript logic should be triggered - * to handle the form submission in an application-specific way. - * - * For this reason, Angular prevents the default action (form submission to the server) unless the - * `` element has an `action` attribute specified. - * - * You can use one of the following two ways to specify what javascript method should be called when - * a form is submitted: - * - * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element - * - {@link ng.directive:ngClick ngClick} directive on the first - * button or input field of type submit (input[type=submit]) - * - * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit} - * or {@link ng.directive:ngClick ngClick} directives. - * This is because of the following form submission rules in the HTML specification: - * - * - If a form has only one input field then hitting enter in this field triggers form submit - * (`ngSubmit`) - * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter - * doesn't trigger submit - * - if a form has one or more input fields and one or more buttons or input[type=submit] then - * hitting enter in any of the input fields will trigger the click handler on the *first* button or - * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) - * - * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is - * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit` - * to have access to the updated model. - * - * ## Animation Hooks - * - * Animations in ngForm are triggered when any of the associated CSS classes are added and removed. - * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any - * other validations that are performed within the form. Animations in ngForm are similar to how - * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well - * as JS animations. - * - * The following example shows a simple way to utilize CSS transitions to style a form element - * that has been rendered as invalid after it has been validated: - * - *
    - * //be sure to include ngAnimate as a module to hook into more
    - * //advanced animations
    - * .my-form {
    - *   transition:0.5s linear all;
    - *   background: white;
    - * }
    - * .my-form.ng-invalid {
    - *   background: red;
    - *   color:white;
    - * }
    - * 
    - * - * @example - - - - - - userType: - Required!
    - userType = {{userType}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    - -
    - - it('should initialize to model', function() { - var userType = element(by.binding('userType')); - var valid = element(by.binding('myForm.input.$valid')); - - expect(userType.getText()).toContain('guest'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - var userType = element(by.binding('userType')); - var valid = element(by.binding('myForm.input.$valid')); - var userInput = element(by.model('userType')); - - userInput.clear(); - userInput.sendKeys(''); - - expect(userType.getText()).toEqual('userType ='); - expect(valid.getText()).toContain('false'); - }); - -
    - * - * @param {string=} name Name of the form. If specified, the form controller will be published into - * related scope, under this name. - */ -var formDirectiveFactory = function(isNgForm) { - return ['$timeout', function($timeout) { - var formDirective = { - name: 'form', - restrict: isNgForm ? 'EAC' : 'E', - controller: FormController, - compile: function ngFormCompile(formElement) { - // Setup initial state of the control - formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS); - - return { - pre: function ngFormPreLink(scope, formElement, attr, controller) { - // if `action` attr is not present on the form, prevent the default action (submission) - if (!('action' in attr)) { - // we can't use jq events because if a form is destroyed during submission the default - // action is not prevented. see #1238 - // - // IE 9 is not affected because it doesn't fire a submit event and try to do a full - // page reload if the form was destroyed by submission of the form via a click handler - // on a button in the form. Looks like an IE9 specific bug. - var handleFormSubmission = function(event) { - scope.$apply(function() { - controller.$commitViewValue(); - controller.$setSubmitted(); - }); - - event.preventDefault(); - }; - - addEventListenerFn(formElement[0], 'submit', handleFormSubmission); - - // unregister the preventDefault listener so that we don't not leak memory but in a - // way that will achieve the prevention of the default action. - formElement.on('$destroy', function() { - $timeout(function() { - removeEventListenerFn(formElement[0], 'submit', handleFormSubmission); - }, 0, false); - }); - } - - var parentFormCtrl = controller.$$parentForm, - alias = controller.$name; - - if (alias) { - setter(scope, null, alias, controller, alias); - attr.$observe(attr.name ? 'name' : 'ngForm', function(newValue) { - if (alias === newValue) return; - setter(scope, null, alias, undefined, alias); - alias = newValue; - setter(scope, null, alias, controller, alias); - parentFormCtrl.$$renameControl(controller, alias); - }); - } - formElement.on('$destroy', function() { - parentFormCtrl.$removeControl(controller); - if (alias) { - setter(scope, null, alias, undefined, alias); - } - extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards - }); - } - }; - } - }; - - return formDirective; - }]; -}; - -var formDirective = formDirectiveFactory(); -var ngFormDirective = formDirectiveFactory(true); - -/* global VALID_CLASS: false, - INVALID_CLASS: false, - PRISTINE_CLASS: false, - DIRTY_CLASS: false, - UNTOUCHED_CLASS: false, - TOUCHED_CLASS: false, - $ngModelMinErr: false, -*/ - -// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231 -var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/; -var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; -var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i; -var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; -var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/; -var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; -var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/; -var MONTH_REGEXP = /^(\d{4})-(\d\d)$/; -var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/; - -var inputType = { - - /** - * @ngdoc input - * @name input[text] - * - * @description - * Standard HTML text input with angular data binding, inherited by most of the `input` elements. - * - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Adds `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object then this is used directly. - * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$` - * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. - * This parameter is ignored for input[type=password] controls, which will never trim the - * input. - * - * @example - - - -
    - Single word: - - Required! - - Single word only! - - text = {{example.text}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var text = element(by.binding('example.text')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.text')); - - it('should initialize to model', function() { - expect(text.getText()).toContain('guest'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - - expect(text.getText()).toEqual('text ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if multi word', function() { - input.clear(); - input.sendKeys('hello world'); - - expect(valid.getText()).toContain('false'); - }); - -
    - */ - 'text': textInputType, - - /** - * @ngdoc input - * @name input[date] - * - * @description - * Input with date validation and transformation. In browsers that do not yet support - * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601 - * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many - * modern browsers do not yet support this input type, it is important to provide cues to users on the - * expected input format via a placeholder or label. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a - * valid ISO date string (yyyy-MM-dd). - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be - * a valid ISO date string (yyyy-MM-dd). - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Pick a date in 2013: - - - Required! - - Not a valid date! - value = {{example.value | date: "yyyy-MM-dd"}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var value = element(by.binding('example.value | date: "yyyy-MM-dd"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (see https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2013-10-22'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-01-01'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
    - */ - 'date': createDateInputType('date', DATE_REGEXP, - createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']), - 'yyyy-MM-dd'), - - /** - * @ngdoc input - * @name input[datetime-local] - * - * @description - * Input with datetime validation and transformation. In browsers that do not yet support - * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a - * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be - * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Pick a date between in 2013: - - - Required! - - Not a valid date! - value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2010-12-28T14:57:00'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-01-01T23:59:00'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
    - */ - 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP, - createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']), - 'yyyy-MM-ddTHH:mm:ss.sss'), - - /** - * @ngdoc input - * @name input[time] - * - * @description - * Input with time validation and transformation. In browsers that do not yet support - * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a - * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a - * valid ISO time format (HH:mm:ss). - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a - * valid ISO time format (HH:mm:ss). - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Pick a between 8am and 5pm: - - - Required! - - Not a valid date! - value = {{example.value | date: "HH:mm:ss"}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var value = element(by.binding('example.value | date: "HH:mm:ss"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('14:57:00'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('23:59:00'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
    - */ - 'time': createDateInputType('time', TIME_REGEXP, - createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']), - 'HH:mm:ss.sss'), - - /** - * @ngdoc input - * @name input[week] - * - * @description - * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support - * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * week format (yyyy-W##), for example: `2013-W02`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a - * valid ISO week format (yyyy-W##). - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be - * a valid ISO week format (yyyy-W##). - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Pick a date between in 2013: - - - Required! - - Not a valid date! - value = {{example.value | date: "yyyy-Www"}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var value = element(by.binding('example.value | date: "yyyy-Www"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2013-W01'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-W01'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
    - */ - 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'), - - /** - * @ngdoc input - * @name input[month] - * - * @description - * Input with month validation and transformation. In browsers that do not yet support - * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601 - * month format (yyyy-MM), for example: `2009-01`. - * - * The model must always be a Date object, otherwise Angular will throw an error. - * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string. - * If the model is not set to the first of the month, the next view to model update will set it - * to the first of the month. - * - * The timezone to be used to read/write the `Date` instance in the model can be defined using - * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be - * a valid ISO month format (yyyy-MM). - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must - * be a valid ISO month format (yyyy-MM). - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Pick a month in 2013: - - - Required! - - Not a valid month! - value = {{example.value | date: "yyyy-MM"}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var value = element(by.binding('example.value | date: "yyyy-MM"')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - // currently protractor/webdriver does not support - // sending keys to all known HTML5 input controls - // for various browsers (https://github.com/angular/protractor/issues/562). - function setInput(val) { - // set the value of the element and force validation. - var scr = "var ipt = document.getElementById('exampleInput'); " + - "ipt.value = '" + val + "';" + - "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });"; - browser.executeScript(scr); - } - - it('should initialize to model', function() { - expect(value.getText()).toContain('2013-10'); - expect(valid.getText()).toContain('myForm.input.$valid = true'); - }); - - it('should be invalid if empty', function() { - setInput(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - - it('should be invalid if over max', function() { - setInput('2015-01'); - expect(value.getText()).toContain(''); - expect(valid.getText()).toContain('myForm.input.$valid = false'); - }); - -
    - */ - 'month': createDateInputType('month', MONTH_REGEXP, - createDateParser(MONTH_REGEXP, ['yyyy', 'MM']), - 'yyyy-MM'), - - /** - * @ngdoc input - * @name input[number] - * - * @description - * Text input with number validation and transformation. Sets the `number` validation - * error if not a valid number. - * - * The model must always be a number, otherwise Angular will throw an error. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. - * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object then this is used directly. - * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$` - * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Number: - - Required! - - Not valid number! - value = {{example.value}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    -
    -
    - - var value = element(by.binding('example.value')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('example.value')); - - it('should initialize to model', function() { - expect(value.getText()).toContain('12'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if over max', function() { - input.clear(); - input.sendKeys('123'); - expect(value.getText()).toEqual('value ='); - expect(valid.getText()).toContain('false'); - }); - -
    - */ - 'number': numberInputType, - - - /** - * @ngdoc input - * @name input[url] - * - * @description - * Text input with URL validation. Sets the `url` validation error key if the content is not a - * valid URL. - * - *
    - * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex - * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify - * the built-in validators (see the {@link guide/forms Forms guide}) - *
    - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object then this is used directly. - * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$` - * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - URL: - - Required! - - Not valid url! - text = {{url.text}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    - myForm.$error.url = {{!!myForm.$error.url}}
    -
    -
    - - var text = element(by.binding('url.text')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('url.text')); - - it('should initialize to model', function() { - expect(text.getText()).toContain('http://google.com'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - - expect(text.getText()).toEqual('text ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if not url', function() { - input.clear(); - input.sendKeys('box'); - - expect(valid.getText()).toContain('false'); - }); - -
    - */ - 'url': urlInputType, - - - /** - * @ngdoc input - * @name input[email] - * - * @description - * Text input with email validation. Sets the `email` validation error key if not a valid email - * address. - * - *
    - * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex - * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can - * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide}) - *
    - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of - * any length. - * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string - * that contains the regular expression body that will be converted to a regular expression - * as in the ngPattern directive. - * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match - * a RegExp found by evaluating the Angular expression given in the attribute value. - * If the expression evaluates to a RegExp object then this is used directly. - * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$` - * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Email: - - Required! - - Not valid email! - text = {{email.text}}
    - myForm.input.$valid = {{myForm.input.$valid}}
    - myForm.input.$error = {{myForm.input.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    - myForm.$error.email = {{!!myForm.$error.email}}
    -
    -
    - - var text = element(by.binding('email.text')); - var valid = element(by.binding('myForm.input.$valid')); - var input = element(by.model('email.text')); - - it('should initialize to model', function() { - expect(text.getText()).toContain('me@example.com'); - expect(valid.getText()).toContain('true'); - }); - - it('should be invalid if empty', function() { - input.clear(); - input.sendKeys(''); - expect(text.getText()).toEqual('text ='); - expect(valid.getText()).toContain('false'); - }); - - it('should be invalid if not email', function() { - input.clear(); - input.sendKeys('xxx'); - - expect(valid.getText()).toContain('false'); - }); - -
    - */ - 'email': emailInputType, - - - /** - * @ngdoc input - * @name input[radio] - * - * @description - * HTML radio button. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string} value The value to which the expression should be set when selected. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {string} ngValue Angular expression which sets the value to which the expression should - * be set when selected. - * - * @example - - - -
    - Red
    - Green
    - Blue
    - color = {{color.name | json}}
    -
    - Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`. -
    - - it('should change state', function() { - var color = element(by.binding('color.name')); - - expect(color.getText()).toContain('blue'); - - element.all(by.model('color.name')).get(0).click(); - - expect(color.getText()).toContain('red'); - }); - -
    - */ - 'radio': radioInputType, - - - /** - * @ngdoc input - * @name input[checkbox] - * - * @description - * HTML checkbox. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {expression=} ngTrueValue The value to which the expression should be set when selected. - * @param {expression=} ngFalseValue The value to which the expression should be set when not selected. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * - * @example - - - -
    - Value1:
    - Value2:
    - value1 = {{checkboxModel.value1}}
    - value2 = {{checkboxModel.value2}}
    -
    -
    - - it('should change state', function() { - var value1 = element(by.binding('checkboxModel.value1')); - var value2 = element(by.binding('checkboxModel.value2')); - - expect(value1.getText()).toContain('true'); - expect(value2.getText()).toContain('YES'); - - element(by.model('checkboxModel.value1')).click(); - element(by.model('checkboxModel.value2')).click(); - - expect(value1.getText()).toContain('false'); - expect(value2.getText()).toContain('NO'); - }); - -
    - */ - 'checkbox': checkboxInputType, - - 'hidden': noop, - 'button': noop, - 'submit': noop, - 'reset': noop, - 'file': noop -}; - -function stringBasedInputType(ctrl) { - ctrl.$formatters.push(function(value) { - return ctrl.$isEmpty(value) ? value : value.toString(); - }); -} - -function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - stringBasedInputType(ctrl); -} - -function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) { - var type = lowercase(element[0].type); - - // In composition mode, users are still inputing intermediate text buffer, - // hold the listener until composition is done. - // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent - if (!$sniffer.android) { - var composing = false; - - element.on('compositionstart', function(data) { - composing = true; - }); - - element.on('compositionend', function() { - composing = false; - listener(); - }); - } - - var listener = function(ev) { - if (timeout) { - $browser.defer.cancel(timeout); - timeout = null; - } - if (composing) return; - var value = element.val(), - event = ev && ev.type; - - // By default we will trim the value - // If the attribute ng-trim exists we will avoid trimming - // If input type is 'password', the value is never trimmed - if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) { - value = trim(value); - } - - // If a control is suffering from bad input (due to native validators), browsers discard its - // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the - // control's value is the same empty value twice in a row. - if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) { - ctrl.$setViewValue(value, event); - } - }; - - // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the - // input event on backspace, delete or cut - if ($sniffer.hasEvent('input')) { - element.on('input', listener); - } else { - var timeout; - - var deferListener = function(ev, input, origValue) { - if (!timeout) { - timeout = $browser.defer(function() { - timeout = null; - if (!input || input.value !== origValue) { - listener(ev); - } - }); - } - }; - - element.on('keydown', function(event) { - var key = event.keyCode; - - // ignore - // command modifiers arrows - if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; - - deferListener(event, this, this.value); - }); - - // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it - if ($sniffer.hasEvent('paste')) { - element.on('paste cut', deferListener); - } - } - - // if user paste into input using mouse on older browser - // or form autocomplete on newer browser, we need "change" event to catch it - element.on('change', listener); - - ctrl.$render = function() { - element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); - }; -} - -function weekParser(isoWeek, existingDate) { - if (isDate(isoWeek)) { - return isoWeek; - } - - if (isString(isoWeek)) { - WEEK_REGEXP.lastIndex = 0; - var parts = WEEK_REGEXP.exec(isoWeek); - if (parts) { - var year = +parts[1], - week = +parts[2], - hours = 0, - minutes = 0, - seconds = 0, - milliseconds = 0, - firstThurs = getFirstThursdayOfYear(year), - addDays = (week - 1) * 7; - - if (existingDate) { - hours = existingDate.getHours(); - minutes = existingDate.getMinutes(); - seconds = existingDate.getSeconds(); - milliseconds = existingDate.getMilliseconds(); - } - - return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds); - } - } - - return NaN; -} - -function createDateParser(regexp, mapping) { - return function(iso, date) { - var parts, map; - - if (isDate(iso)) { - return iso; - } - - if (isString(iso)) { - // When a date is JSON'ified to wraps itself inside of an extra - // set of double quotes. This makes the date parsing code unable - // to match the date string and parse it as a date. - if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') { - iso = iso.substring(1, iso.length - 1); - } - if (ISO_DATE_REGEXP.test(iso)) { - return new Date(iso); - } - regexp.lastIndex = 0; - parts = regexp.exec(iso); - - if (parts) { - parts.shift(); - if (date) { - map = { - yyyy: date.getFullYear(), - MM: date.getMonth() + 1, - dd: date.getDate(), - HH: date.getHours(), - mm: date.getMinutes(), - ss: date.getSeconds(), - sss: date.getMilliseconds() / 1000 - }; - } else { - map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 }; - } - - forEach(parts, function(part, index) { - if (index < mapping.length) { - map[mapping[index]] = +part; - } - }); - return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0); - } - } - - return NaN; - }; -} - -function createDateInputType(type, regexp, parseDate, format) { - return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) { - badInputChecker(scope, element, attr, ctrl); - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - var timezone = ctrl && ctrl.$options && ctrl.$options.timezone; - var previousDate; - - ctrl.$$parserName = type; - ctrl.$parsers.push(function(value) { - if (ctrl.$isEmpty(value)) return null; - if (regexp.test(value)) { - // Note: We cannot read ctrl.$modelValue, as there might be a different - // parser/formatter in the processing chain so that the model - // contains some different data format! - var parsedDate = parseDate(value, previousDate); - if (timezone === 'UTC') { - parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset()); - } - return parsedDate; - } - return undefined; - }); - - ctrl.$formatters.push(function(value) { - if (value && !isDate(value)) { - throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value); - } - if (isValidDate(value)) { - previousDate = value; - if (previousDate && timezone === 'UTC') { - var timezoneOffset = 60000 * previousDate.getTimezoneOffset(); - previousDate = new Date(previousDate.getTime() + timezoneOffset); - } - return $filter('date')(value, format, timezone); - } else { - previousDate = null; - return ''; - } - }); - - if (isDefined(attr.min) || attr.ngMin) { - var minVal; - ctrl.$validators.min = function(value) { - return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal; - }; - attr.$observe('min', function(val) { - minVal = parseObservedDateValue(val); - ctrl.$validate(); - }); - } - - if (isDefined(attr.max) || attr.ngMax) { - var maxVal; - ctrl.$validators.max = function(value) { - return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal; - }; - attr.$observe('max', function(val) { - maxVal = parseObservedDateValue(val); - ctrl.$validate(); - }); - } - - function isValidDate(value) { - // Invalid Date: getTime() returns NaN - return value && !(value.getTime && value.getTime() !== value.getTime()); - } - - function parseObservedDateValue(val) { - return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined; - } - }; -} - -function badInputChecker(scope, element, attr, ctrl) { - var node = element[0]; - var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity); - if (nativeValidation) { - ctrl.$parsers.push(function(value) { - var validity = element.prop(VALIDITY_STATE_PROPERTY) || {}; - // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430): - // - also sets validity.badInput (should only be validity.typeMismatch). - // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email) - // - can ignore this case as we can still read out the erroneous email... - return validity.badInput && !validity.typeMismatch ? undefined : value; - }); - } -} - -function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { - badInputChecker(scope, element, attr, ctrl); - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - - ctrl.$$parserName = 'number'; - ctrl.$parsers.push(function(value) { - if (ctrl.$isEmpty(value)) return null; - if (NUMBER_REGEXP.test(value)) return parseFloat(value); - return undefined; - }); - - ctrl.$formatters.push(function(value) { - if (!ctrl.$isEmpty(value)) { - if (!isNumber(value)) { - throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value); - } - value = value.toString(); - } - return value; - }); - - if (attr.min || attr.ngMin) { - var minVal; - ctrl.$validators.min = function(value) { - return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal; - }; - - attr.$observe('min', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val, 10); - } - minVal = isNumber(val) && !isNaN(val) ? val : undefined; - // TODO(matsko): implement validateLater to reduce number of validations - ctrl.$validate(); - }); - } - - if (attr.max || attr.ngMax) { - var maxVal; - ctrl.$validators.max = function(value) { - return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal; - }; - - attr.$observe('max', function(val) { - if (isDefined(val) && !isNumber(val)) { - val = parseFloat(val, 10); - } - maxVal = isNumber(val) && !isNaN(val) ? val : undefined; - // TODO(matsko): implement validateLater to reduce number of validations - ctrl.$validate(); - }); - } -} - -function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { - // Note: no badInputChecker here by purpose as `url` is only a validation - // in browsers, i.e. we can always read out input.value even if it is not valid! - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - stringBasedInputType(ctrl); - - ctrl.$$parserName = 'url'; - ctrl.$validators.url = function(modelValue, viewValue) { - var value = modelValue || viewValue; - return ctrl.$isEmpty(value) || URL_REGEXP.test(value); - }; -} - -function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { - // Note: no badInputChecker here by purpose as `url` is only a validation - // in browsers, i.e. we can always read out input.value even if it is not valid! - baseInputType(scope, element, attr, ctrl, $sniffer, $browser); - stringBasedInputType(ctrl); - - ctrl.$$parserName = 'email'; - ctrl.$validators.email = function(modelValue, viewValue) { - var value = modelValue || viewValue; - return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value); - }; -} - -function radioInputType(scope, element, attr, ctrl) { - // make the name unique, if not defined - if (isUndefined(attr.name)) { - element.attr('name', nextUid()); - } - - var listener = function(ev) { - if (element[0].checked) { - ctrl.$setViewValue(attr.value, ev && ev.type); - } - }; - - element.on('click', listener); - - ctrl.$render = function() { - var value = attr.value; - element[0].checked = (value == ctrl.$viewValue); - }; - - attr.$observe('value', ctrl.$render); -} - -function parseConstantExpr($parse, context, name, expression, fallback) { - var parseFn; - if (isDefined(expression)) { - parseFn = $parse(expression); - if (!parseFn.constant) { - throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' + - '`{1}`.', name, expression); - } - return parseFn(context); - } - return fallback; -} - -function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) { - var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true); - var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false); - - var listener = function(ev) { - ctrl.$setViewValue(element[0].checked, ev && ev.type); - }; - - element.on('click', listener); - - ctrl.$render = function() { - element[0].checked = ctrl.$viewValue; - }; - - // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false` - // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert - // it to a boolean. - ctrl.$isEmpty = function(value) { - return value === false; - }; - - ctrl.$formatters.push(function(value) { - return equals(value, trueValue); - }); - - ctrl.$parsers.push(function(value) { - return value ? trueValue : falseValue; - }); -} - - -/** - * @ngdoc directive - * @name textarea - * @restrict E - * - * @description - * HTML textarea element control with angular data-binding. The data-binding and validation - * properties of this element are exactly the same as those of the - * {@link ng.directive:input input element}. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any - * length. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. - */ - - -/** - * @ngdoc directive - * @name input - * @restrict E - * - * @description - * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding, - * input state control, and validation. - * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers. - * - *
    - * **Note:** Not every feature offered is available for all input types. - * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`. - *
    - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {boolean=} ngRequired Sets `required` attribute if set to true - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any - * length. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to user - * interaction with the input element. - * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input. - * This parameter is ignored for input[type=password] controls, which will never trim the - * input. - * - * @example - - - -
    -
    - User name: - - Required!
    - Last name: - - Too short! - - Too long!
    -
    -
    - user = {{user}}
    - myForm.userName.$valid = {{myForm.userName.$valid}}
    - myForm.userName.$error = {{myForm.userName.$error}}
    - myForm.lastName.$valid = {{myForm.lastName.$valid}}
    - myForm.lastName.$error = {{myForm.lastName.$error}}
    - myForm.$valid = {{myForm.$valid}}
    - myForm.$error.required = {{!!myForm.$error.required}}
    - myForm.$error.minlength = {{!!myForm.$error.minlength}}
    - myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
    -
    -
    - - var user = element(by.exactBinding('user')); - var userNameValid = element(by.binding('myForm.userName.$valid')); - var lastNameValid = element(by.binding('myForm.lastName.$valid')); - var lastNameError = element(by.binding('myForm.lastName.$error')); - var formValid = element(by.binding('myForm.$valid')); - var userNameInput = element(by.model('user.name')); - var userLastInput = element(by.model('user.last')); - - it('should initialize to model', function() { - expect(user.getText()).toContain('{"name":"guest","last":"visitor"}'); - expect(userNameValid.getText()).toContain('true'); - expect(formValid.getText()).toContain('true'); - }); - - it('should be invalid if empty when required', function() { - userNameInput.clear(); - userNameInput.sendKeys(''); - - expect(user.getText()).toContain('{"last":"visitor"}'); - expect(userNameValid.getText()).toContain('false'); - expect(formValid.getText()).toContain('false'); - }); - - it('should be valid if empty when min length is set', function() { - userLastInput.clear(); - userLastInput.sendKeys(''); - - expect(user.getText()).toContain('{"name":"guest","last":""}'); - expect(lastNameValid.getText()).toContain('true'); - expect(formValid.getText()).toContain('true'); - }); - - it('should be invalid if less than required min length', function() { - userLastInput.clear(); - userLastInput.sendKeys('xx'); - - expect(user.getText()).toContain('{"name":"guest"}'); - expect(lastNameValid.getText()).toContain('false'); - expect(lastNameError.getText()).toContain('minlength'); - expect(formValid.getText()).toContain('false'); - }); - - it('should be invalid if longer than max length', function() { - userLastInput.clear(); - userLastInput.sendKeys('some ridiculously long name'); - - expect(user.getText()).toContain('{"name":"guest"}'); - expect(lastNameValid.getText()).toContain('false'); - expect(lastNameError.getText()).toContain('maxlength'); - expect(formValid.getText()).toContain('false'); - }); - -
    - */ -var inputDirective = ['$browser', '$sniffer', '$filter', '$parse', - function($browser, $sniffer, $filter, $parse) { - return { - restrict: 'E', - require: ['?ngModel'], - link: { - pre: function(scope, element, attr, ctrls) { - if (ctrls[0]) { - (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer, - $browser, $filter, $parse); - } - } - } - }; -}]; - - - -var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; -/** - * @ngdoc directive - * @name ngValue - * - * @description - * Binds the given expression to the value of `
    - - it('should load template defined inside script tag', function() { - element(by.css('#tpl-link')).click(); - expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/); - }); - - - */ -var scriptDirective = ['$templateCache', function($templateCache) { - return { - restrict: 'E', - terminal: true, - compile: function(element, attr) { - if (attr.type == 'text/ng-template') { - var templateUrl = attr.id, - text = element[0].text; - - $templateCache.put(templateUrl, text); - } - } - }; -}]; - -var ngOptionsMinErr = minErr('ngOptions'); -/** - * @ngdoc directive - * @name select - * @restrict E - * - * @description - * HTML `SELECT` element with angular data-binding. - * - * # `ngOptions` - * - * The `ngOptions` attribute can be used to dynamically generate a list of `